挂起的@transactional 方法会阻塞资源吗?

Does suspended @transactional method block resource?

AFAIK outer 方法和 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

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

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