sql - hibernate/ Spring : Pessimist vs Optimist locking?

标签 sql spring hibernate jpa spring-data

在使用 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/

相关文章:

java - 如果在不同表的多个事务中一个事务失败,在 hibernate 中是否可以回滚?

sql - 如何使用最大包装尺寸将产品转换为带包装尺寸的产品

spring - Hibernate Jpa-主键(序列)上的约束违反异常

Spring Security 使用 HttpSecurity 授权对 url 和方法的请求

spring - 使用 Maven/JUnit/Spring 在第一次失败时停止测试

java - JPA + hibernate 外键为空

java - 如何使用 Spring Boot Hibernate 将 XML 字符串保存在 Postgresql 表的 XML 类型列中

java - 如何使用jdbc在mysql中动态传递表名?

如果第二个匹配,mysql从两个表中选择信息

c# - 使用数据库中的Reverse-LIKE进行选择