如何实现跨摄像头手势识别?分布式部署案例
2026/1/13 15:34:35
在 Spring 中,当你在方法上使用@Transactional注解时,事务的开启、数据库操作的执行以及事务的提交/回滚,遵循以下流程:
BEGIN或类似指令);INSERT、UPDATE等)会立即执行并写入数据库,但这些更改处于“未提交”状态(对其他事务不可见,取决于隔离级别);COMMIT),此时数据才真正持久化并对其他事务可见;ROLLBACK),所有在该方法中执行的数据库操作全部撤销。❌不是“等方法执行完才进库”
✅而是“方法执行过程中就进库了,但未提交;方法成功结束才提交”
也就是说:
@Transactional public void transfer(Long from, Long to, BigDecimal amount) { accountDao.deduct(from, amount); // ← 这行执行时,SQL 已发给数据库,但未 COMMIT accountDao.add(to, amount); // ← 同上 // 如果这里抛出 RuntimeException if (amount.compareTo(BigDecimal.ZERO) <= 0) { throw new IllegalArgumentException("金额必须大于0"); } }deduct和add都执行成功,但在最后检查时抛出异常;COMMIT,数据正式落盘。@Transactional也无效。IOException)不会触发回滚,除非显式配置rollbackFor。表格
| 阶段 | 行为 |
|---|---|
| 方法开始前 | Spring 开启事务(BEGIN) |
| 方法执行中 | SQL 语句立即执行,但处于未提交状态 |
| 方法成功结束 | Spring 提交事务(COMMIT)→ 数据真正入库 |
| 方法抛出异常 | Spring 回滚事务(ROLLBACK)→ 数据撤销 |
所以答案是:先进库(执行 SQL),但不提交;等方法执行完再决定提交或回滚。