我有两个表A和B。
我的交易是这样的:
我想避免脏读/幻象读取,因为我有多个节点向同一个数据库发出请求。
这里是一个示例:
现在,事务2客户端具有脏数据。我应该如何避免这种情况?
答案 0 :(得分:1)
如果未记录数据库,则无法执行任何操作。通过选择未记录的数据库,设置数据库的人认为这不是问题。解决此问题的唯一方法是将数据库模式更改为日志模式,但这不是您随便做的事情-更改有很多后果。
假设您的数据库已记录-此处是缓冲日志记录还是非缓冲日志记录,或者(主要是)MODE ANSI数据库都没有关系-那么除非您设置DIRTY READ隔离,否则至少要使用COMMITTED READ隔离(如果数据库是MODE ANSI,它将是Informix的REPEATABLE READ级别,是标准SQL的SERIALIZABLE级别。
如果要确保在事务读取数据行后它们不会更改,则需要以更高的隔离度运行-REPEATABLE READ。 (有关详细信息,请参见手册中的SET ISOLATION。(请注意SET TRANSACTION的命名;手册中有关于Comparing SET ISOLATION and SET TRANSACTION的部分以及相关部分。)使用SET ISOLATION TO的不利之处可重复读取(或SET TRANSACTION ISOLATION LEVEL SERIALIZABLE)是需要的额外锁会降低并发性,但可以为您提供有关数据库状态的最佳保证。