事务(Transaction):是数据库中的能够保证若干个写操作(增、删、改)要么全部成功,要么全部失败的机制。提示:关于Spring JDBC框架,只要项目中添加了基于Spring的数据库编程的依赖项,都包含Spring JDBC框架的依赖项,例如在mybatis-spring-boot-starter
中就包含了spring-jdbc
依赖项。
在基于Spring JDBC的项目中,只需要在业务方法上添加@Transactional
即可使得此业务方法是事务性的,即具有“要么全部成功,要么全部失败”的特性。
这是一种声明式声务(因为注解也是声明的一部分,只需要声明,即可实现事务管理)。
关于添加@Transactional
注解:
- 【推荐--学习阶段】添加在接口上
- 将作用于实现类中所有重写的方法
- 【推荐--开发实践中】添加在接口的业务方法上
- 将作用于实现类中重写的此方法
- 添加在业务实现类上
- 将作用于当前类中的所有业务方法
- 添加在业务实现类的业务方法上
- 将作用于当前业务方法
**注意:**基于Spring JDBC的事务管理,是基于接口实现的,所以,必须存在接口,且@Transactional
注解只对接口中声明的方法是有效的,对于实现类中自定义的方法是无效的!
事务管理的核心概念:
- **开启:**BEGIN
- **提交:**COMMIT
- **回滚:**ROLLBACK
在进行事务管理时,需要先开启事务,当所有的操作都正确的执行后,应该提交事务,此时,数据才会被写入到数据库存储中,如果执行过程中失败,应该回滚事务,则此前执行写操作都不会被写入到数据库存储中。
事务管理本质大致如下:
开启事务(关闭自动提交)
-- 全部执行成功时:提交事务,即将数据写入到硬盘
-- 出现错误时:回滚事务,放弃将已经成功执行的写操作写入到硬盘
打开自动提交
在Spring JDBC的事务管理中,大致如下:
try {
【开启事务】
执行你的业务方法
【提交事务】
} catch (RuntimeException e) {
【回滚事务】
}
**注意:**基于Spring JDBC的事务管理中,只对RuntimeException
及其子孙类异常回滚!
在使用@Transactional
注解时,可以配置rollbackFor
/ rollbackForClassName
属性来指定对某些种类的异常回滚(仍必须是RuntimeException
或其子孙类异常),也可以配置noRollbackFor
/ noRollbackForClassName
属性来指定对某些种类的异常不回滚。
【关于Spring JDBC事务管理的小结】
- 当某个业务涉及超过1次增、删、改操作(例如2次增、1次增和1次改、1次删和1改,甚至更多次),必须保证此业务是事务性的
- 在接口中的抽象方法上添加
@Transactional
注解,即可使得此方法是事务性的- 在学习阶段,推荐在业务接口上添加此注解,避免遗漏
- 在实现业务的过程中,当视为“失败”时,应该抛出
RuntimeException
或其子孙类异常,使得事务管理机制执行回滚