spring事务管理
什么是事务?
事务是数据库中执行操作的最小单元,不可再分,要么全部执行成功,要么全部执行失败。
事务的特性
1、原子性:事务是最小的,不可再分。
2、一致性:要么成功,要么失败。
3、隔离性:相互隔离,彼此互不影响。
4、持久性:提交的事务保持不变。
局部事务
单个资源,比如单个服务器或数据库。并且事务由底层资源管理。
全局事务(也称分布式事务)
多个资源,比如多个服务器和数据库。并且spring中事务由单独、专门的事务管理器进行管理。
spring声明式管理
使用时只需要声明@Transatinal注解即可。spring声明式管理采用了动态代理机制(动态代理机制分为:JDK和CGLIB)。
底层原理(应用了AOP思想)
spring声明式事务使用
在spring环境中:
1、在配置类上方使用EnableTransactionManagement注解。
2、@transactional注解可以添加在业务类、接口(spring5.0版本以上)、方法上。
事务的传播方式
传播级别:required和required new。
required:若没有事务,则开启新事务;若有事务,则继续使用当前的事务。
required new:若没有事务,则开启新事务;若有事务,则停止原来的事务,开启新的事务。
注意:事务传播的前提是,调用其他类的方法,传播级别才能生效;若在同一个类中调用不同的方法,则只能共用同一个事务。
事务回滚
默认情况下,业务方法抛出运行时异常,事务回滚可以自定义回滚条件,出现什么异常回滚,出现什么异常不回滚。
@Transactional(rollbackFor=xxxException.class,norollbackFor=xxx.Exception.class)
注意:若在测试方法/测试类中使用@transactional,则事务会执行测试方法,但执行完后事务会回滚,不会提交。
事务的隔离级别
属性:isolation
属性值:
1、读未提交:read uncommitted。事务可以读取到其他事务未提交/未回滚之前的数据。
2、读已提交:read committed
3、可重复读:repeatable read
4、可串行化:serializable
mysql的隔离级别是:可重复读(不产生幻读,因为通过已经通过其他方式得到解决)。
oracle、sql server的隔离级别是:读已提交。