当中途发生变化时,select命令将返回什么状态

时间:2018-06-10 15:09:26

标签: sql-server

我们运行了命令select * from table1,它会持续很长时间。然后,有人更新了table1中的数据。那么,我们将得到什么,以前的数据或变化的数据?

1 个答案:

答案 0 :(得分:2)

如果有人更新您正在阅读的同一个表,会发生什么情况取决于您正在运行的隔离级别。您可以找到详细信息here,但这里是关键点:

  • READ COMMITTED

    • 当前事务中各个语句之间的其他事务可以更改数据,从而导致不可重复的读取或幻像数据。

    • 如果READ_COMMITTED_SNAPSHOT设置为OFF(默认值),则数据库引擎使用共享锁来防止其他事务修改行

    • 如果READ_COMMITTED_SNAPSHOT设置为ON,则数据库引擎使用行版本控制为每个语句显示事件一致的数据快照,该快照存在于语句的开头。

  • REPEATABLE READ

    • 在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据
  • 快照

    • 事务只能识别在事务开始之前提交的数据修改。在当前事务开始后由其他事务进行的数据修改对当前事务中执行的语句不可见。
  • SERIALIZABLE

    • 在当前交易完成之前,没有其他交易可以修改当前交易所读取的数据。

    • 其他事务无法插入新行,其键值将落在当前事务中任何语句读取的键范围内,直到当前事务完成。