事务控制基础
MyBatis 事务控制是保证数据一致性的核心机制。
事务类型
XML
<transactionManager type="JDBC"/>
<!-- 或 -->
<transactionManager type="MANAGED"/>
| 类型 | 说明 |
|---|---|
| JDBC | MyBatis 管理事务,手动 commit/rollback |
| MANAGED | 容器管理事务(如 Spring) |
手动提交模式
Java
SqlSession session = sqlSessionFactory.openSession();
try {
mapper.insertUser(user1);
mapper.insertOrder(order1);
session.commit(); // 手动提交
} catch (Exception e) {
session.rollback(); // 回滚
throw e;
} finally {
session.close();
}
自动提交模式
Java
SqlSession session = sqlSessionFactory.openSession(true); // 自动提交
try {
mapper.insertUser(user1); // 自动提交
mapper.insertOrder(order1); // 自动提交
} finally {
session.close();
}
注意:自动提交模式下,每条 SQL 单独提交,无法保证多操作原子性。
事务隔离级别
Java
// 开启时指定隔离级别
SqlSession session = sqlSessionFactory.openSession(
ExecutorType.SIMPLE,
TransactionIsolationLevel.READ_COMMITTED
);
| 隔离级别 | 说明 |
|---|---|
| READ_UNCOMMITTED | 读未提交(最低) |
| READ_COMMITTED | 读已提交 |
| REPEATABLE_READ | 可重复读 |
| SERIALIZABLE | 串行化(最高) |
Spring 集成事务
Java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
public void createUserWithOrder(User user, Order order) {
userMapper.insertUser(user);
orderMapper.insertOrder(order);
// 任何异常抛出,整个事务回滚
}
}
推荐:与 Spring 集成时使用 @Transactional 注解,自动管理事务边界。
要点总结
- JDBC 事务需手动 commit/rollback,MANAGED 由容器管理
- 自动提交模式每条 SQL 单独提交,不保证原子性
- 多操作需保证原子性时,使用手动提交或 @Transactional
- 推荐与 Spring 集成使用 @Transactional 管理事务
📝 发现内容有误?点击此处直接编辑