例如,如果调用某个执行批处理作业的过程,则需要10分钟。它反过来访问某个表。如果在运行过程(事务)中访问的表在这10分钟内更新,会发生什么?事务将忽略这些更改并在过程调用时保持表的状态?示例:用户表
|user_id|some_value|
|-------|----------|
| 1| 213|
| 3| 444|
-- and so on
如果用户id=3的某个\u值更改为1,但事务仍在运行,逐行处理用户表,并且在某个\u值更新时未处理id=1的用户,则过程(事务)中的值是什么?1还是444?
1条答案
按热度按时间efzxgjgh1#
一般来说,事务总是能看到自己的文字:如果您运行
update mytable set some_value=1 where user_id=3
只要此事务正在运行,select some_value from mytable where user_id=3
在此事务中返回1。但其他并发事务无法看到此“挂起”更新。如果此事务通过回滚结束,则没有人能够看到此值:不是同一会话中的新事务,也不是另一会话中的另一事务。
如果此事务以提交结束,则所有其他事务都将看到此新值,无论它们是在另一个会话中运行还是在同一个会话中运行。
这假设默认事务隔离级别为read committed。