如何在当前会话中获得隔离级别?
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')
syssessions
和 sysopendb
表通常是可读的。您可以简单地查询sysopendb
而根本不使用syssessions
— 您可以简单地获取odb_isolation
列。其他信息向我保证我得到了正确的信息。
改变隔离级别的语句是:
SET ISOLATION SET TRANSACTIONSET 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 或多或少地获得相同的结果。
【讨论】:
以上是关于如何在当前会话中获得隔离级别?的主要内容,如果未能解决你的问题,请参考以下文章