例如,当您使用@Transactional并指定隔离级别时,这是否意味着您正在使用悲观锁定?
不一定。
您可以指定一种方法来执行
脏读
通过将隔离指定为
READ UNCOMMITTED
如果另一个事务已修改但尚未提交方法正在读取的行,则基本上会返回已修改但尚未提交的值。这是因为在此隔离级别中,在读取时不会创建共享读取锁。因此,简而言之,此方法执行基本读取,而不需要考虑锁定。
能否同时使用悲观锁和乐观锁?
绝对地
您可以要求Hibernate对包含
@Version
字段,如果您的用例指示您需要该行为。
我听说乐观主义者锁定通常更好,但我还没有发现很多项目有@Version之类的东西。。。大多数时候,我总是看到@Transaction Spring注释被用来管理事务。
我要说的是,web上充满了琐碎的例子,它们没有考虑到复杂应用程序中数据一致性的所有内在需求。这些示例主要是为了说明以下内容优于对应内容
@Transactional
public void doSomeSpecialThing() {
}
vs公司
public void doSomeSpecialThing() {
entityManager.getTransaction().begin();
try {
entityManager.getTransaction().commit();
}
catch ( Exception e ) {
if ( entityManager.getTransaction().isActive() ) {
entityManager.getTransaction().rollback();
}
throw e;
}
}
无论您是否需要在方法的数据访问代码中应用悲观、乐观或两者的组合,都将成为特定于用例的需要,而不是泛化。