我有两张桌子A和B。
我的交易是这样的:
我想避免脏/幻读,因为我有多个节点向同一个数据库发出请求。
这是一个例子:
现在事务2客户端有脏数据。我应该如何避免这种情况?
如果您的数据库未记录,您将无能为力。通过选择未记录的数据库,设置它的人认为此类问题不是问题。解决这里问题的唯一方法是将数据库模式更改为日志模式,但这不是您随心所欲地随意做的事情 - 更改会产生很多后果。
假设您的数据库已记录 - 这里无论是缓冲日志记录还是非缓冲日志记录或(主要)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 的缺点可重复读取(或设置事务隔离级别可串行化)的特点是所需的额外锁会减少并发性,但会为您提供有关数据库状态的最佳保证。