MyBatisPlus 事务
时间: 2025-04-26 16:48:56 浏览: 32
### MyBatisPlus 中事务的使用教程及常见问题解决
#### 1. 事务管理基础概念
在 Spring 和 MyBatis 的集成环境中,通常通过 `@Transactional` 注解来声明事务边界。MyBatis Plus 基于 MyBatis 构建,在事务处理方面继承了 MyBatis 的特性并进行了优化[^1]。
#### 2. 使用 @Transactional 注解定义事务范围
为了确保数据库操作在一个完整的事务上下文中执行,可以利用 Spring 提供的 `@Transactional` 注解标记服务层的方法或类。当方法抛出未捕获异常时,默认情况下会触发回滚机制。
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) {
try {
int result = userMapper.insert(user);
if (result != 1) throw new RuntimeException("Insert failed");
// Simulate an error to test rollback
int i = 1 / 0;
} catch (Exception e) {
log.error("Error occurred during transaction", e);
throw e; // Ensure the exception propagates up for rollback
}
}
}
```
#### 3. 多数据源场景下的分布式事务支持
对于多数据源的应用程序来说,仅依靠本地事务无法满足需求。此时可借助 Seata 等分布式事务解决方案实现跨多个资源的一致性提交。Seata 支持 AT 模式、TCC 模式等多种方式来保障全局事务的成功与否[^3]。
#### 4. 防止误更新已删除记录
为了避免意外覆盖已被逻辑删除的数据条目,建议在编写 SQL 更新语句时加入额外条件判断目标对象的状态字段(如 is_deleted)。MyBatis Plus 提供了一种便捷的方式——Wrapper 实体模式下自动生成 WHERE 子句时自动排除指定列[^4]。
```java
// Example of safe update with condition checking
LambdaUpdateWrapper<User> wrapper = Wrappers.<User>lambdaUpdate()
.set(User::getUsername, "newName")
.eq(User::getId, userId)
.ne(User::getIsDeleted, true); // Prevent updating deleted records
int rowsAffected = userMapper.update(null, wrapper);
if (rowsAffected == 0) {
throw new BusinessLogicException("Record not found or already deleted.");
}
```
阅读全文
相关推荐


















