我将隔离级别设置为脏读,但我想检查当前的隔离级别。如何获得隔离级别?对于DB2,我发现了以下内容:如何在DB2上获得当前隔离级别?,但我正在寻找Informix12.1。有人能帮忙吗?
发布于 2021-10-16 20:53:52
除非您的驱动程序提供了一个方法,否则我认为除了在sysmaster数据库中查询适当的表之外,没有其他方法。关键信息在表sysopendb中(也在另一个- syssqlstat中,它是一般公众无法读取的:SQL272:没有syssqlstat的选择权限)。
文件: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隔离可以在事务之外使用(它是Informix扩展,但也是Informix用户最常用的扩展)。SET事务只能在事务运行时使用。
另一个关键信息是解码隔离级别。我使用这个脚本作为用户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软件档案中获得),我编写它是为了在shell脚本环境中保持一致,而DB-Access则不这样做。它可以追溯到1986年(在dbaccess出现之前;在那些日子里,您使用的是isql - DB-Access是在一个晚上从isql中分离出来的)。它与微软的约翰尼--最近的同名程序--没有任何关系,只是名称和通用用途相同(操纵SQL数据库)。您可以或多或少地使用DB-Access实现相同的结果。
https://stackoverflow.com/questions/69595414
复制相似问题