【问题标题】:what is the default value for IBM Informix set isolation levelIBM Informix 设置隔离级别的默认值是多少
【发布时间】:2018-11-19 09:22:53
【问题描述】:

1 存储过程

create procedure sp_count_demo(
i_user_id varchar(30)
)
returning p_count as num_of_row ;

define p_count integer ;

set isolation to dirty read ;

let p_row = 0 ;

select count(*)
into p_count
from some_table a
where a.user_id = i_user_id
;

return p_row;

end procedure ;

2 (1)处的过程将从带有连接池的java webapps调用

3 在返回结果之前是否需要将隔离级别设置回之前的值? (即避免另一个进程重用具有“脏读”隔离级别的连接)

4 什么是默认隔离级别

5 在哪里/如何获取隔离级别的默认值

提前致谢

【问题讨论】:

    标签: connection informix pool isolation


    【解决方案1】:

    由于正在使用连接池,因此存储过程应将隔离级别恢复为之前的设置,以避免其他应用使用相同连接时出现意外结果。默认隔离级别取决于数据库的日志记录模式:

    • 对于未记录的数据库,它实际上是“脏读”(onstat -g ses 命令显示为 NL)。
    • 对于模式 ANSI 数据库,它将是“可重复读取”。
    • 对于其他已记录的数据库,它将是“已提交读取”。

    onconfig 参数USELASTCOMMITTED 也可用于更改默认隔离级别的使用方式。可以在知识中心找到更多信息(在 USELASTCOMMITTED 上搜索)。

    会话可以使用对 sysmaster 数据库的查询来找出其当前的隔离级别。此查询在 Informix 12.10 上运行,但也应该对 11.70 有效:

    select tx.isolevel
    from sysmaster:systxptab tx, sysmaster:sysrstcb r, sysmaster:sysscblst s
    where s.address = r.scb and tx.owner = r.address
    and s.sid = dbinfo("sessionid");
    

    它以整数形式返回隔离级别,这是一个内部值 - 例如,提交的读取值为 2。我不相信隔离级别到整数值的映射已发布,因此您需要尝试设置不同的级别会话,然后运行上述查询。

    【讨论】:

    • 另一种验证和设置隔离级别的方法是使用 JDBC getTransactionIsolation()setTransactionIsolation(int level) 方法。当然需要对其进行测试,以检查其行为是否符合预期。
    • 对于 Informix 11.50 也有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多