首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在当前会话中获得隔离级别?

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

Stack Overflow用户
提问于 2021-10-16 12:03:53
回答 1查看 455关注 0票数 1

我将隔离级别设置为脏读,但我想检查当前的隔离级别。如何获得隔离级别?对于DB2,我发现了以下内容:如何在DB2上获得当前隔离级别?,但我正在寻找Informix12.1。有人能帮忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-16 20:53:52

除非您的驱动程序提供了一个方法,否则我认为除了在sysmaster数据库中查询适当的表之外,没有其他方法。关键信息在表sysopendb中(也在另一个- syssqlstat中,它是一般公众无法读取的:SQL272:没有syssqlstat的选择权限)。

文件:find.isolation.sql

代码语言:javascript
复制
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隔离可以在事务之外使用(它是Informix扩展,但也是Informix用户最常用的扩展)。SET事务只能在事务运行时使用。

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

代码语言:javascript
复制
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

产出如下:

代码语言:javascript
复制
+ 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的表。

代码语言:javascript
复制
$ 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实现相同的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69595414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档