从数据库中进行选择时避免脏/虚幻读取



我有两个表A和B。

我的交易是这样的:

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

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

这里有一个例子:

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

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

如果你的数据库没有被记录,你就无能为力。通过选择一个未被记录的数据库,那些设置它的人认为这类问题不是问题。解决这个问题的唯一方法是将数据库模式更改为日志记录,但这不是你一时兴起就随便做的事情——更改会产生很多后果。

假设您的数据库已被记录——这里不管它是缓冲日志记录还是非缓冲日志记录,或者(主要是(MODE ANSI数据库——那么除非您设置了DIRTY READ隔离,否则您运行时至少使用COMMITTED READ隔离(如果数据库是MODE ANSI,它将是Informix的REPEATABLE READ级别,标准SQL的SERIALIZABLE级别(。

如果您想确保数据行在事务读取后不会发生更改,则需要以更高的隔离度运行——REPEATABLE read。(详细信息请参阅手册中的SET ISOLATION。)使用SET ISOLATION to REPEATABLE READ(或SET TRANSACTION ISOLATION LEVEL SERIALIZABLE(的缺点是,所需的额外锁可以减少并发性,但可以为您提供有关数据库状态的最佳保证。

最新更新