在 Java 中开启 SQL 事务,主要取决于你使用的是 JDBC、Spring(声明式/编程式事务)还是 ORM 框架(MyBatis、JPA 等)。下面按常见情况说明。
JDBC 默认是 自动提交(autoCommit = true),需要手动关闭。
Connection conn = null;
try {
conn = dataSource.getConnection();
// 1. 关闭自动提交,开启事务
conn.setAutoCommit(false);
// 2. 执行 SQL
PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET money = money - 100 WHERE id = 1");
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement("UPDATE account SET money = money + 100 WHERE id = 2");
ps2.executeUpdate();
// 3. 提交事务
conn.commit();
} catch (Exception e) {
// 4. 回滚事务
if (conn != null) conn.rollback();
e.printStackTrace();
} finally {
if (conn != null) conn.close();
}
✅ 关键点:
setAutoCommit(false):开启事务commit():提交rollback():回滚@Service
public class AccountService {
@Transactional
public void transfer() {
// 多个 SQL 操作
accountMapper.decrease(1, 100);
accountMapper.increase(2, 100);
}
}
✅ 需要:
@EnableTransactionManagement(Spring Boot 默认开启)@Autowired
private TransactionTemplate transactionTemplate;
public void transfer() {
transactionTemplate.execute(status -> {
accountMapper.decrease(1, 100);
accountMapper.increase(2, 100);
return null;
});
}
@Transactional
public void saveUser() {
userRepository.save(user1);
userRepository.save(user2);
}
✅ JPA 默认就在事务中(Spring 管理)
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRED
)
JDBC:setAutoCommit(false)
Spring:@Transactional 搞定一切
如果你用的是 MyBatis / Spring Boot / 多数据源,可以告诉我,我可以给你更具体的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。