代码之家  ›  专栏  ›  技术社区  ›  AntonBoarf

休眠/春天:悲观主义者vs乐观主义者锁定?

  •  1
  • AntonBoarf  · 技术社区  · 6 年前

    在使用诸如Hibernate(带有Spring框架)之类的ORM工具时,锁定和事务有一些我不太清楚的地方。

    例如,当您使用@Transactional并指定隔离级别时,这是否意味着您正在使用悲观锁定?

    能否同时使用悲观锁和乐观锁? 我听说乐观主义者锁定通常更好,但我还没有发现很多项目有@Version之类的东西。。。大多数时候,我总是看到@Transaction Spring注释被用来管理事务。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Naros    6 年前

    例如,当您使用@Transactional并指定隔离级别时,这是否意味着您正在使用悲观锁定?

    不一定。

    您可以指定一种方法来执行 脏读 通过将隔离指定为 READ UNCOMMITTED 如果另一个事务已修改但尚未提交方法正在读取的行,则基本上会返回已修改但尚未提交的值。这是因为在此隔离级别中,在读取时不会创建共享读取锁。因此,简而言之,此方法执行基本读取,而不需要考虑锁定。

    能否同时使用悲观锁和乐观锁?

    绝对地

    您可以要求Hibernate对包含 @Version 字段,如果您的用例指示您需要该行为。

    我听说乐观主义者锁定通常更好,但我还没有发现很多项目有@Version之类的东西。。。大多数时候,我总是看到@Transaction Spring注释被用来管理事务。

    我要说的是,web上充满了琐碎的例子,它们没有考虑到复杂应用程序中数据一致性的所有内在需求。这些示例主要是为了说明以下内容优于对应内容

    @Transactional
    public void doSomeSpecialThing() {
      // do your thing here
    }
    

    vs公司

    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;
      }
    }
    

    无论您是否需要在方法的数据访问代码中应用悲观、乐观或两者的组合,都将成为特定于用例的需要,而不是泛化。