我有 n 台机器同时写入数据库(sql server)(启动事务)。我将隔离级别设置为可序列化。我的理解是,无论哪台机器的事务首先到达数据库,都会被执行,而其他事务将在完成时被阻止。
那是对的吗?
我有 n 台机器同时写入数据库(sql server)(启动事务)。我将隔离级别设置为可序列化。我的理解是,无论哪台机器的事务首先到达数据库,都会被执行,而其他事务将在完成时被阻止。
那是对的吗?
这取决于 - 他们都执行相同的活动吗?也就是说,完全相同的语句以相同的顺序执行,没有流控制?
如果不是,并且两个连接正在访问数据库中的独立对象,它们可以并行运行。
如果资源有一些重叠,那么多个连接可能会取得一些进展,直到其中一个想要获取另一个已经拥有的锁——此时它将等待。那么就有可能出现死锁。
语句不能读取已被其他事务修改但尚未提交的数据。
在当前事务完成之前,任何其他事务都不能修改当前事务已读取的数据。
在当前事务完成之前,其他事务不能插入键值落在当前事务中的任何语句读取的键范围内的新行。
无论哪台机器的事务首先到达数据库,都会被执行,而其他事务将在此完成时被阻止
不,我不正确。结果应该就像每个事务一个接一个地执行(顺序地,因此隔离级别名称)。但是引擎可以自由使用它喜欢的任何实现,只要它遵守可序列化隔离模型的保证。有些引擎实际上几乎按照您的描述实现了它,例如。Redis 事务(尽管 Redis 没有“隔离级别”的概念)。
对于 SQL Server,事务将并行执行,直到遇到锁冲突。当发生冲突时,已授予锁的事务继续不受干扰,而以冲突模式请求锁的事务必须等待锁释放(以提交已授予的事务)。哪个事务恰好是请求,哪个事务恰好是被授予的,完全取决于正在执行的内容。这意味着很可能第二台机器首先获得授权并首先完成,而第一台机器等待。
为了更好地理解在可序列化隔离级别下锁定行为有何不同,请参阅Key-Range Locking
是的,这对于任何隔离级别的写操作都是正确的:“我的理解是,无论哪台机器的事务首先到达数据库,都会被执行,而其他事务将在完成时被阻塞。”
隔离级别有助于确定当您在此过程中读取数据时会发生什么。可序列化的读取操作将阻止您的写入操作,这可能是您想要的行为。