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

问题描述 投票:0回答:1

我有两张桌子A和B。

我的交易是这样的:

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

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

这是一个例子:

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

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

sql database transactions informix dirtyread
1个回答
1
投票

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

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

如果要确保数据行在事务读取后不会更改,则需要以更高的隔离性运行——REPEATABLE READ。 (有关详细信息,请参阅手册中的 SET ISOLATION。(请注意 SET TRANSACTION 的术语;手册中有一节是关于 比较 SET ISOLATION 和 SET TRANSACTION 及相关部分。)使用 SET ISOLATION 的缺点可重复读取(或设置事务隔离级别可串行化)的特点是所需的额外锁会减少并发性,但会为您提供有关数据库状态的最佳保证。

© www.soinside.com 2019 - 2024. All rights reserved.