挂起的@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,在这种情况下没有持有锁。因此,仅查看此代码不足以判断是否有东西被锁定。
但是,是的,在事务中锁定代码的任何数据库级别都会持续到事务完成。
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,在这种情况下没有持有锁。因此,仅查看此代码不足以判断是否有东西被锁定。
但是,是的,在事务中锁定代码的任何数据库级别都会持续到事务完成。