如何在当前会话中获得隔离级别?

Posted

技术标签:

【中文标题】如何在当前会话中获得隔离级别?【英文标题】:How to get isolation level in current session? 【发布时间】:2021-12-04 06:56:59 【问题描述】:

我在某些地方将隔离级别设置为脏读,但我想检查当前的隔离级别。如何获得隔离级别? 对于 DB2 发现:How to obtain current isolation level on DB2?, 但我正在寻找 Informix 12.1。有人可以帮忙吗?

【问题讨论】:

Google 说:Check isolation levels 您使用的是什么驱动程序/客户端。 Java JDBC 提供了一种获取隔离级别的方法。 【参考方案1】:

除非您的驱动程序提供方法,否则我认为除了查询sysmaster 数据库中的相应表之外没有其他方法。关键信息在一个表sysopendb 中(以及另一个——syssqlstat,一般公众无法读取:SQL -272:syssqlstat 没有 SELECT 权限)。

文件:find.isolation.sql

SELECT s.sid,
       s.username,
       s.feprogram,
       o.odb_dbname,
       o.odb_isolation,
  FROM syssessions AS s
  JOIN sysopendb AS o ON s.sid = o.odb_sessionid
 WHERE s.sid = DBINFO('sessionid')

syssessionssysopendb 表通常是可读的。您可以简单地查询sysopendb 而根本不使用syssessions — 您可以简单地获取odb_isolation 列。其他信息向我保证我得到了正确的信息。

改变隔离级别的语句是:

SET ISOLATION SET TRANSACTION

SET ISOLATION 可以在事务之外使用(它是 Informix 扩展,也是 Informix 用户最常用的扩展)。 SET TRANSACTION 只能在事务运行时使用。

另一个关键信息是解码隔离级别。我用这个脚本作为用户informix运行:

for level in "read committed" "repeatable read" "serializable" "read uncommitted"
do
    sqlcmd -d sysmaster \
        -e begin \
        -x \
        -e "set transaction isolation level $level" \
        -e 'trace off' \
        -f find.isolation.sql
done

for level in "dirty read" "committed read" "committed read last committed" \
             "repeatable read" "cursor stability"
do
    a6 sqlcmd -d sysmaster -x \
        -e "set isolation to $level" \
        -e 'trace off' \
        -f find.isolation.sql
done

输出是:

+ set transaction isolation level read committed
479|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|2
+ set transaction isolation level repeatable read
480|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|5
+ set transaction isolation level serializable
481|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|5
+ set transaction isolation level read uncommitted
482|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|1
+ set isolation to dirty read
483|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|1
+ set isolation to committed read
484|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|2
+ set isolation to committed read last committed
485|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|11
+ set isolation to repeatable read
486|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|5
+ set isolation to cursor stability
487|informix|/Users/jonathanleffler/bin/sqlcmd|sysmaster|3

我使用此查询和结果查找syssqlstat 和其他列名包含iso 的表:

$ sqlcmd -d sysmaster -e "select t.tabname, t.tabid, t.tabtype, c.colname,
>                                c.colno, c.coltype, c.collength
>                           from systables as t
>                           join syscolumns as c on t.tabid = c.tabid
>                           where c.colname matches '*iso*'"
systxptab|116|T|isolevel|25|1|2
sysxatab|117|T|isolevel|5|1|2
sysopendb|181|T|odb_isolation|7|1|2
syssqlstat|183|T|sqs_iso|3|1|2
syssqltrace|218|T|sql_isollevel|37|2|4
systrans|277|V|tx_isolevel|15|1|2
syssqlcurall|286|V|sqc_isolationlevel|3|13|200
syssqlcurses|287|V|scs_isolationlevel|3|13|200
$

正在使用的程序是 SQLCMD(可从IIUG Software Archive 获得),它 我写的是在 shell 脚本上下文中表现一致,而 DB-Access 没有。 它可以追溯到 1986 年(之前有 dbaccess;在那些日子里,你 改用 isql — DB-Access 是从 isql 中分割出来的 晚上)。 它与 Microsoft 的 johnny-come-lately 计划无关 同名——除了名称并具有相同的通用目的 (操作 SQL 数据库)。 您可以使用 DB-Access 或多或少地获得相同的结果。

【讨论】:

以上是关于如何在当前会话中获得隔离级别?的主要内容,如果未能解决你的问题,请参考以下文章

mysql事务的隔离级别

查询修改mysql事务隔离级别

如何查询现有 postgres 会话的事务隔离级别?

mysql,oracle,sql server中的默认事务隔离级别查看,更改

修改事务隔离级别的暗门

MySQL事物隔离级别及搜索引擎