在使用 Hibernate(带有 Spring 框架)等 ORM 工具时,我不确定是否理解锁定和事务。
例如,当您使用 @Transactional 并指定隔离级别时,这是否意味着您正在使用悲观锁定?
可以同时使用悲观锁和乐观锁吗? 我听说乐观锁定通常更好,但我还没有找到很多带有 @Version 等东西的项目......大多数时候我总是看到 @Transaction Spring 注释被用来管理事务。
谢谢
最佳答案
For example when you're using @Transactional and you're specifying an isolation level, does that mean you're using pessimist locking ?
不一定。
您可以通过将隔离指定为 READ UNCOMMITTED 来指定执行脏读的方法,并且如果另一个事务已修改但尚未提交您的方法正在读取的行,您基本上将返回已修改但尚未提交的值。这是因为在此隔离级别中,读取时不会创建共享读锁。简而言之,此方法执行基本读取,无需考虑锁定。
Can you both use pessimist and optimist lock at the same time ?
当然。
如果您的用例表明您需要该行为,您可以要求 Hibernate 对包含 @Version
字段的实体应用悲观锁。
I've heard optimist locking is generally better but I haven't found many project with @Version stuff etc...Most of the time I always see @Transaction Spring annotation being used to manage transactions.
我想说,网络上充满了琐碎的示例,这些示例没有考虑到复杂应用程序中数据一致性的所有内在需求。这些例子主要是为了说明以下内容优于其对应内容
@Transactional
public void doSomeSpecialThing() {
// do your thing here
}
对比
public void doSomeSpecialThing() {
entityManager.getTransaction().begin();
try {
// do your thing here
entityManager.getTransaction().commit();
}
catch ( Exception e ) {
if ( entityManager.getTransaction().isActive() ) {
entityManager.getTransaction().rollback();
}
throw e;
}
}
无论您需要在方法的数据访问代码中应用悲观、乐观还是两者的组合,都将成为用例特定的需求,而不是概括。
关于sql - hibernate/ Spring : Pessimist vs Optimist locking?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296259/