从数据库中选择时避免脏读/幻象读取

时间:2018-11-13 08:17:47

标签: sql database transactions informix dirtyread

我有两个表A和B。

我的交易是这样的:

  • 读取->从表A中读取
  • 写->写表B,写表A

我想避免脏读/幻象读取,因为我有多个节点向同一个数据库发出请求。

这里是一个示例:

  1. 事务1-表B正在进行更新
  2. 交易2-表A正在进行读取
  3. 交易1-表A正在进行更新
  4. 交易2-已完成
  5. 交易1-回滚

现在,事务2客户端具有脏数据。我应该如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

如果未记录数据库,则无法执行任何操作。通过选择未记录的数据库,设置数据库的人认为这不是问题。解决此问题的唯一方法是将数据库模式更改为日志模式,但这不是您随便做的事情-更改有很多后果。

假设您的数据库已记录-此处是缓冲日志记录还是非缓冲日志记录,或者(主要是)MODE ANSI数据库都没有关系-那么除非您设置DIRTY READ隔离,否则至少要使用COMMITTED READ隔离(如果数据库是MODE ANSI,它将是Informix的REPEATABLE READ级别,是标准SQL的SERIALIZABLE级别。

如果要确保在事务读取数据行后它们不会更改,则需要以更高的隔离度运行-REPEATABLE READ。 (有关详细信息,请参见手册中的SET ISOLATION。(请注意SET TRANSACTION的命名;手册中有关于Comparing SET ISOLATION and SET TRANSACTION的部分以及相关部分。)使用SET ISOLATION TO的不利之处可重复读取(或SET TRANSACTION ISOLATION LEVEL SERIALIZABLE)是需要的额外锁会降低并发性,但可以为您提供有关数据库状态的最佳保证。