我有两张桌子A和B。
我的交易是这样的:
- 读取 -> 从表 A 中读取
- 写入 -> 写入表 B,写入表 A
我想避免脏/幻读,因为我有多个节点向同一个数据库发出请求。
这是一个例子:
- 事务 1 - 表 B 上发生更新
- 事务 2 - 表 A 上发生读取
- 事务 1 - 表 A 上发生更新
- 交易 2 - 已完成
- 事务 1 - 回滚
现在事务 2 客户端有脏数据。我应该如何避免这种情况?
我有两张桌子A和B。
我的交易是这样的:
我想避免脏/幻读,因为我有多个节点向同一个数据库发出请求。
这是一个例子:
现在事务 2 客户端有脏数据。我应该如何避免这种情况?
如果您的数据库未记录,则您无能为力。通过选择一个未记录的数据库,设置它的人认为这类问题不是问题。解决此问题的唯一方法是将数据库模式更改为记录,但这不是您随心所欲地做的事情 - 更改有很多后果。
假设您的数据库已记录——无论是缓冲记录还是非缓冲记录或(主要)MODE ANSI 数据库都无关紧要——那么除非您设置 DIRTY READ 隔离,否则您至少使用 COMMITTED READ 隔离运行(它将是Informix 的 REPEATABLE READ 级别,标准 SQL 的 SERIALIZABLE 级别,如果数据库是 MODE ANSI)。
如果要确保数据行在事务读取后不会更改,则需要以更高的隔离度运行——可重复读取。(有关详细信息,请参阅手册中的SET ISOLATION。(注意SET TRANSACTION的命名法;手册中有一节关于比较 SET ISOLATION 和 SET TRANSACTION及相关部分。)使用 SET ISOLATION TO REPEATABLE READ(或 SET)的缺点TRANSACTION ISOLATION LEVEL SERIALIZABLE) 是需要的额外锁会降低并发性——但可以为您提供有关数据库状态的最佳保证。