java - 暂停的@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
解决方案
事务本身不负责锁定行或表。如果 dao 执行的 sql 正在锁定正在更新的行,则该锁定将一直保持到事务完成或超时。更新可能使用乐观锁定,在这种情况下没有持有锁。因此,仅查看此代码不足以判断是否有东西被锁定。
但是,是的,任何在事务中锁定代码的数据库级别都会持续到事务完成。
推荐阅读
- java - 生成签名的 apk/bundle 时任务 ':app:transformClassesAndResourcesWithR8ForRelease' 执行失败
- python - 如何使用 UNION 语句在 python 中合并两个 SQLite 表(当前出现“ValueError: parameters are of unsupported type”错误消息)
- python - 信号处理程序必须是 signal.SIG_IGN、signal.SIG_DFL 或可调用对象
- c - 同时使用 malloc 和 FILE 指针时出错
- python-3.x - 是否可以在不使用硬件适配器的情况下直接使用 UART 与自动售货机(使用 MDB)进行通信?
- python - 如何让 lxml 将两个页面保存到页面中,以便树可以读取它?
- python-3.x - 如何抓取无法检查的数据和内部的数据
- javascript - 如何使用范围接口在双击时选择一个单词?
- java - Java Generic:如何扩展另一个泛型类的泛型类
- angular - 从 mergeMap 返回的 observable 无法捕获错误