Java小白入门 —— Spring事务
一. 什么是事务
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
二. 事务的特点( ACID )
1. 原子性( Atomicity )
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此,事务如果成功就必须完全应用到数据库,如果失败就必须对数据库没有任何影响。
2. 一致性( Consistency )
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
3. 隔离性 ( Isolation )
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
4. 持久性 ( Durability )
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
三. 事务类型
1. 编程式事务
自己手动控制事务,就叫做编程式事务控制。类似于JDBC的事务管理,Spring管理使用TransactionTemplate事务。
细粒度的事务控制:可以对指定的方法、指定的方法的某几行添加事务控制,比较灵活,但每次都要开启、提交、回滚,开发起来比较繁琐。
2. 声明式事务
Spring 提供了对事务的管理, 这个就叫声明式事务管理。
Spring 提供了对事务控制的实现。用户如果想用 Spring 的声明式事务管理,只需要在配置文件中配置即可;不想使用时直接移除配置。这个实现了对事务控制的最大程度的解耦。
Spring 声明式事务管理,核心实现就是基于 AOP。
粗粒度的事务控制: 只能给整个方法应用事务,不可以对方法的某几行应用事务,AOP 只能拦截方法,不能拦截具体几行代码 。
Spring 声明式事务管理器类:
JDBC 技术:DataSourceTransactionManager
Hibernate 技术:HibernateTransactionManager
3. 使用事务注意事项
事物是程序运行如果没有错误,会自动提交事物,如果程序运行发生异常,则会自动回滚。
如果使用了try捕获异常时.一定要在catch里面手动回滚。
事物手动回滚代码
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
4. 事务注解
@Transactional注解:
1)应用事务的注解
2)定义到方法上: 当前方法应用spring的声明式事务
3)定义到类上: 当前类的所有的方法都应用Spring声明式事务管理;
4)定义到父类上: 当执行父类的方法时候应用事务。
步骤:
1) 必须引入Aop相关的jar文件
2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类
3)在需要添加事务控制的地方,写上: @Transactional
四. 事务的传播方式
名称 | 描述 |
---|---|
PROPAGATION_REQUIRED | 持当前事务,如果当前没有事务,就新建一个事务。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 支持当前事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
五. 事务的传播行为
名称 | 描述 |
---|---|
Propagation.REQUIRED | 指定当前的方法必须在事务的环境下执行;如果当前运行的方法,已经存在事务,就会加入当前的事务。 |
Propagation.REQUIRED_NEW | 指定当前的方法必须在事务的环境下执行;如果当前运行的方法,已经存在事务,事务会挂起;会始终开启一个新的事务,执行完后; 刚才挂起的事务才继续运行。 |