SQL server隔离级别

时间:2012-08-14 07:20:37

标签: sql-server tsql transactions transactionscope isolation-level

我有n台机器在同一时间写入DB(sql server)(启动一个事务)。我将隔离级别设置为可序列化。我的理解是,无论哪台机器的事务首先进入数据库,都会被执行,而其他事务将在完成后被阻止。

这是对的吗?

3 个答案:

答案 0 :(得分:2)

这取决于 - 他们都在进行相同的活动吗?也就是说,完全相同的语句以相同的顺序执行,没有流量控制?

如果没有,并且两个连接正在访问数据库中的独立对象,它们可以并行运行。

如果资源有一些重叠,那么多个连接可能会取得一些进展,直到其中一个想要锁定另一个已经存在的锁定 - 此时它将等待。然后就有可能发生死锁。


SERIALIZABLE

  
      
  • 语句无法读取已修改但尚未由其他交易提交的数据。

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

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

  •   

答案 1 :(得分:2)

  

任何一台机器的交易首先进入数据库,执行完毕,其他交易将在此完成时被阻止

不,这是我的错误。如果每个事务一个接一个地执行(串行,因此是隔离级别名称),结果应该 as 。但是引擎可以自由使用它喜欢的任何实现,只要它尊重可序列化隔离模型的保证。有些引擎实际上就像你描述的那样实现它,例如。 Redis Transactions(尽管Redis没有“隔离级别”概念)。

对于SQL Server,事务将并行执行直到它们发生锁定冲突。发生冲突时,具有锁定授权的事务继续不受干扰,而在冲突模式下请求锁定的事务必须等待锁定释放(对于授予的授权事务)。 哪个事务恰好是请求,哪一个恰好是被授予的,完全取决于正在执行的内容。这意味着,当第一台机器等待时,第二台机器首先获得授权并首先完成,这可能就是这种情况。

为了更好地理解锁定行为在可序列化隔离级别下的不同,请参阅Key-Range Locking

答案 2 :(得分:0)

是的,对于任何隔离级别的写入操作都是如此:“我的理解是,无论哪个机器的事务首先进入数据库,执行都会被执行,而其他事务将在完成时被阻止。”

隔离级别有助于确定在此过程中读取数据时会发生什么。可序列化的读取操作将阻止您的写入操作,这可能是您想要的行为。