【问题标题】:Avoid dirty/phantom reads while selecting from database从数据库中选择时避免脏读/幻读
【发布时间】:2019-04-16 00:38:08
【问题描述】:

我有两张桌子 A 和 B。

我的交易是这样的:

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

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

这是一个例子:

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

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

【问题讨论】:

  • 您使用的是哪个 RDBMS? SQL Server、Oracle、MySQL?
  • informix 现在。计划迁移到 SQL 服务器
  • 您是否在 Informix 中使用DIRTY READ 隔离级别?在 informix 中,它是读取未提交数据的唯一方法。
  • 不推荐脏读 我想知道有没有其他解决办法。
  • Informix 具有其他隔离级别(根据数据库类型存在限制)。你检查过文档吗?你想要的可能是COMMITTED READCOMMITTED READ LAST COMMITTED

标签: sql database transactions informix dirtyread


【解决方案1】:

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

假设您的数据库已记录——无论是缓冲记录、非缓冲记录还是(主要)模式 ANSI 数据库都无关紧要——那么除非您设置 DIRTY READ 隔离,否则您至少使用 COMMITTED READ 隔离(如果数据库是 MODE ANSI,它将是 Informix 的 REPEATABLE READ 级别,标准 SQL 的 SERIALIZABLE 级别。

如果要确保数据行在事务读取后不会更改,则需要以更高的隔离度运行——可重复读取。 (有关详细信息,请参阅手册中的SET ISOLATION。(注意SET TRANSACTION 的命名法;手册中有一节关于Comparing SET ISOLATION and SET TRANSACTION 和相关部分。)使用SET ISOLATION TO REPEATABLE READ(或SET TRANSACTION)的缺点ISOLATION LEVEL SERIALIZABLE) 是需要的额外锁会降低并发性 - 但可以为您提供有关数据库状态的最佳保证。

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 2014-10-06
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多