[英]When will Hibernate lock table row?
我不太了解表行锁定机制。
如果没有@Transactional
的方法,我知道它会在.save()
方法调用时锁定。
public void test() {
B b = a.findById(1);
a.save(b);
}
如果该方法使用@Transactional
什么时候会锁定表行?
@Transactional
public void test() {
B b = a.findById(1);
B b2 = a.findById(2);
a.save(b);
a.save(b2);
}
进入测试方法时锁定? 还是在第一次查询时锁定? 或在a.save(b)
时锁定?
何时锁定一行取决于您使用的数据库、连接隔离级别和具体查询。 大多数数据库都实现了 MVCC 方案,因此除非明确请求,否则它们可以避免锁定行。 行上的 DML 语句(DELETE、UPDATE)将始终获取排他锁。 然后有各种数据库供应商特定的 SELECT 语句扩展,可用于告诉数据库锁定某些行。 当您指定显式锁定模式时,Hibernate 在幕后使用它。
在您的情况下,您没有指定锁模式,因此在调用 save 时数据库将隐式获取锁,这将执行 SQL UPDATE 语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.