我有两个表A和B。
我的交易是这样的:
- 读取->从表A读取
- 写入->写入表B,写入表A
我希望避免脏/虚幻读取,因为我有多个节点向同一数据库发出请求。
这里有一个例子:
- 事务1-表B上正在进行更新
- 事务2-表A上正在进行读取
- 事务1-表A正在进行更新
- 事务2-已完成
- 事务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(的缺点是,所需的额外锁可以减少并发性,但可以为您提供有关数据库状态的最佳保证。