我想在多线程环境中的以下语句中了解DB2的行为吗?
SELECT * FROM FINAL TABLE
(
UPDATE USERTABLE.USERS
SET MAILED = 3 WHERE NOT MAILED = 3 AND STATUS = 2
)
此查询读取STATUS = 2和MAILED!= 3的所有行,然后设置MAILED = 3,因此下一个查询不应读取相同的行。
如果有两个线程同时开始此查询,会发生什么?是否有可能它们都会读取相同的行并处理它们?我怎么能防止这种情况?我想要,直到第一个查询无法完成另一个查询将不会开始?
答案 0 :(得分:1)
如果有两个线程同时开始此查询,会发生什么?是否有可能它们都会读取相同的行并处理它们?
并发事务读取相同的数据不仅是可能的,而且是不可避免的。您可以使用Read Stability isolation level来阻止并发更新,在这种情况下,其他事务将等待锁释放。要指定隔离级别,请在您的语句中附加WITH RS
或在应用程序会话中发出语句SET ISOLATION RS
。