Kov*_*dra 5 locking transactions isolation-level
我有几个关于标题主题的问题。首先,假设我们使用 JDBC,并且有 2 个事务 T1 和 T2。在 T1 中,我们对一个特定行执行 select 语句。然后我们对该行执行更新。在事务 T2 中,我们在同一行上执行 select 语句。
以下是问题:
1)事务T1什么时候获取上述行的锁?我认为它发生在 select 语句执行期间?
2)事务T1持有锁多久?它会保留它直到事务提交/回滚,还是在此之前释放锁?
3)隔离级别是否控制使用什么类型的锁?例如:
a) 如果我们在事务 T2 上使用读已提交隔离级别,这是否意味着 T2 将为 select 语句使用共享读锁,以便在 T1 已经更新该行的情况下,T2 将无法访问该行(避免脏读),如果 T1 没有更新行,但 T2 将具有对该行的读取访问权限?
b) 如果我们在事务 T2 上使用读未提交隔离级别,这是否意味着 T2 将对 select 语句使用无锁,因此即使 T1 正在修改数据,它也可以读取数据(允许脏读)。
所以,最让我烦恼的问题是谁有权决定应用什么类型的锁?是事务的隔离级别,还是有其他方式?
4) 如果问题 3 的答案是肯定的(隔离级别控制使用什么锁),那么如果我们在 mysql 数据库上使用 jdbc,并且在共享模式构造中使用 select for update 或 select lock,会发生什么情况?我记得第一个是独占锁,第二个是共享读锁。它将如何反映我们的事务隔离级别?
5)可重复读隔离级别会获取什么样的锁?假设我们的 T2(具有可重复读隔离级别)在同一行上有两个 select 语句,而 T1 与之前相同。首先在T2中执行一个select语句,然后执行T1并提交,然后执行T2第二个select。这种情况有可能吗?如果事务在提交/回滚之前一直持有锁,我认为在 T2 完成之前 T1 将无法获得更新的独占锁?
编辑:还有一个问题:
6)在多版本并发控制系统中,当我们设置可序列化 隔离级别时,尝试更新由另一个事务B更新的某些行的事务A(B在A启动后更新了该行)将被回滚。我想问的是,在乐观锁定场景中,这不是发生同样的事情吗?
提前致谢。
你的问题提得很好。了解获取何种类型的锁可以加深对 DBMS 的理解。在 SQL Server 中,在所有隔离级别(未提交读、已提交读(默认)、可重复读、可序列化)下,写操作都会获取独占锁。
无论隔离级别如何,事务结束时都会释放排它锁。
隔离级别之间的差异指的是获取/释放共享(读)锁的方式。
在读未提交隔离级别下,不会获取任何共享锁。在此隔离级别下,可能会发生称为“脏读”的并发问题。
在读提交隔离级别下,将为相关记录获取共享锁。当前指令结束时共享锁被释放。此隔离级别可防止“脏读”,但由于记录可以由其他并发事务更新,因此可能会发生“不可重复读”或“幻读”。
在可重复读取隔离级别下,在事务持续时间内获取共享锁。“脏读”和“不可重复读”被阻止,但“幻读”仍然可能发生。
在可串行化隔离级别下,在事务持续时间内获取范围共享锁。上述并发问题都不会发生,但性能会大幅下降,并且存在发生死锁的风险。
| 归档时间: | 
 | 
| 查看次数: | 2110 次 | 
| 最近记录: |