在 Java + MyBatis 中,事务处理主要有 三种常见方式,下面按使用频率和场景给你系统讲一下。
如果你用的是 Spring / Spring Boot,强烈推荐用 Spring 管理事务。
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void createUser() {
userMapper.insertUser();
userMapper.updateUser();
// 如果抛异常,自动回滚
}
}
✅ 特点:
@Transactional(propagation = Propagation.REQUIRED)
常见类型:
REQUIRED(默认):有就用,没有就建REQUIRES_NEW:新建事务SUPPORTS:有就用,没有就不开@Transactional
public void test() {
try {
userMapper.insert();
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();
}
}
如果你 没有用 Spring,可以手动控制事务。
SqlSession session = sqlSessionFactory.openSession(false); // 关闭自动提交
try {
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.insertUser();
mapper.updateUser();
session.commit(); // 提交
} catch (Exception e) {
session.rollback(); // 回滚
} finally {
session.close();
}
✅ 关键点:
openSession(false) → 手动事务commit() / rollback()<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional
private void test() {} // ❌ 不生效
public void a() {
b(); // ❌ 事务不生效
}
@Transactional
public void b() {}
✅ 解决:使用代理对象或拆类
try {
mapper.insert();
} catch (Exception e) {
// ❌ 不抛异常,事务不会回滚
}
| 方式 | 推荐度 | 场景 |
|---|---|---|
| Spring @Transactional | ⭐⭐⭐⭐⭐ | 企业项目 |
| 手动 SqlSession | ⭐⭐ | 无 Spring |
| XML 事务 | ⭐⭐⭐ | 老项目 |
如果你愿意,我可以:
你现在是 Spring Boot 还是纯 MyBatis?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。