0

我有两张桌子A和B。

我的交易是这样的:

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

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

这是一个例子:

  1. 事务 1 - 表 B 上发生更新
  2. 事务 2 - 表 A 上发生读取
  3. 事务 1 - 表 A 上发生更新
  4. 交易 2 - 已完成
  5. 事务 1 - 回滚

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

4

1 回答 1

1

如果您的数据库未记录,则您无能为力。通过选择一个未记录的数据库,设置它的人认为这类问题不是问题。解决此问题的唯一方法是将数据库模式更改为记录,但这不是您随心所欲地做的事情 - 更改有很多后果。

假设您的数据库已记录——无论是缓冲记录还是非缓冲记录或(主要)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) 是需要的额外锁会降低并发性——但可以为您提供有关数据库状态的最佳保证。

于 2018-11-14T01:19:54.603 回答