首页 > 解决方案 > 暂停的@transactional 方法是否会阻塞资源?

问题描述

AFAIKouter方法和inner方法在数据库级别的 2 个不同事务中运行(因为 REQUIRES_NEW)。outer方法进行更新并等待inner方法提交。这是否意味着outer锁定用户资源直到inner提交?

@Autowired
private TestDAO testDAO;

@Autowired
private SomeBean someBean;

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void outerMethod(User user) {
  testDAO.updateUser(user);
  
  someBean.innerMethod();
  
}

一些豆类:

@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
  //some work
}

更新:

这可以像打开 2 db 控制台一样呈现,然后一一键入并运行:

1. begin # 1st console
 
2. update user set...# 1st console
 
3. 4. 5. begin ...#do some work; commit; # 2nd console

6. commit; # 1st console

标签: javaspringtransactionsspring-transactions

解决方案


事务本身不负责锁定行或表。如果 dao 执行的 sql 正在锁定正在更新的行,则该锁定将一直保持到事务完成或超时。更新可能使用乐观锁定,在这种情况下没有持有锁。因此,仅查看此代码不足以判断是否有东西被锁定。

但是,是的,任何在事务中锁定代码的数据库级别都会持续到事务完成。


推荐阅读