0

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

这是正确的吗?

+0

事务不锁定整个服务器。在表级别,您可以执行行锁定,页面锁定或表锁定。你确定你需要序列化吗?锁越广泛,限制并发越多。 – Paparazzi 2012-08-14 15:32:01

回答

0

是的,这对于任何隔离级别的写操作都是正确的:“我的理解是,无论哪台机器的事务先到达数据库,执行完毕,其他事务将在此过程中被阻止。”

隔离级别有助于确定在读取数据时发生的情况。可串行化的读取操作将阻止您的写入操作,这可能是您想要的行为。

2

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

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

如果资源有一些重叠,那么可能会有多个进程通过多个连接进行,直到他们中的一个想要获取另一个已经拥有的锁定 - 此时它将等待。那么就存在死锁的可能性。


SERIALIZABLE

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

  • 没有其他事务可以修改当前事务读取的数据,直到当前事务完成。

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

+0

他们都在进行相同的活动。流量控制在那里。在事务开始时,如果数据库反映了该事务所具有的同一组数据已被提交,则它完成该事务。 – Sam 2012-08-14 20:25:03

2

取机的事务获取到DB第一,被执行并且,当这完成

没有其他事务将被阻塞,这我不正确。如果每个事务一个接一个地执行(连续执行,因此隔离级别名称),结果应该是,作为。但是引擎可以自由使用任何它喜欢的实现,只要它能够保证可序列化的隔离模型。有些引擎实际上实现它,就像你描述它一样,例如。 Redis Transactions(虽然Redis没有'隔离级别'概念)。

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

为了更好地理解锁定行为下串行隔离级别的不同之处,见Key-Range Locking