如何在当前会话中获得隔离级别?
How to get isolation level in current session?
我在某些地方将隔离级别设置为脏读,但我想检查当前的隔离级别。如何获得隔离级别?
对于 DB2 发现:How to obtain current isolation level on DB2?,
但我正在寻找 Informix 12.1。有人可以帮忙吗?
除非您的驱动程序提供了一种方法,否则我认为除了在 sysmaster
数据库中查询适当的 table 之外别无他法。关键信息在一个table sysopendb
(还有另一个- syssqlstat
是一般人无法读取的 public: SQL -272: No SELECT 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
table 通常是可读的。您可以简单地查询 sysopendb
而根本不使用 syssessions
— 您可以简单地获取 odb_isolation
列。其他信息让我确信我得到了正确的信息。
改变隔离级别的语句是:
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
和其他 table 列名称包含 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
中分割出来的
晚上)。
它与 Microsoft 的 johnny-come-lately 程序无关
相同的名称——除了名称和具有相同的通用目的
(操纵 SQL 个数据库)。
使用 DB-Access 或多或少可以达到相同的结果。
我在某些地方将隔离级别设置为脏读,但我想检查当前的隔离级别。如何获得隔离级别? 对于 DB2 发现:How to obtain current isolation level on DB2?, 但我正在寻找 Informix 12.1。有人可以帮忙吗?
除非您的驱动程序提供了一种方法,否则我认为除了在 sysmaster
数据库中查询适当的 table 之外别无他法。关键信息在一个table sysopendb
(还有另一个- syssqlstat
是一般人无法读取的 public: SQL -272: No SELECT 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
table 通常是可读的。您可以简单地查询 sysopendb
而根本不使用 syssessions
— 您可以简单地获取 odb_isolation
列。其他信息让我确信我得到了正确的信息。
改变隔离级别的语句是:
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
和其他 table 列名称包含 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
中分割出来的
晚上)。
它与 Microsoft 的 johnny-come-lately 程序无关
相同的名称——除了名称和具有相同的通用目的
(操纵 SQL 个数据库)。
使用 DB-Access 或多或少可以达到相同的结果。