我们运行了命令select * from table1
,它会持续很长时间。然后,有人更新了table1
中的数据。那么,我们将得到什么,以前的数据或变化的数据?
答案 0 :(得分:2)
如果有人更新您正在阅读的同一个表,会发生什么情况取决于您正在运行的隔离级别。您可以找到详细信息here,但这里是关键点:
READ COMMITTED
当前事务中各个语句之间的其他事务可以更改数据,从而导致不可重复的读取或幻像数据。
如果READ_COMMITTED_SNAPSHOT设置为OFF(默认值),则数据库引擎使用共享锁来防止其他事务修改行
如果READ_COMMITTED_SNAPSHOT设置为ON,则数据库引擎使用行版本控制为每个语句显示事件一致的数据快照,该快照存在于语句的开头。
REPEATABLE READ
快照
SERIALIZABLE
在当前交易完成之前,没有其他交易可以修改当前交易所读取的数据。
其他事务无法插入新行,其键值将落在当前事务中任何语句读取的键范围内,直到当前事务完成。