开发中事务管理使用_番外篇
1)默认事务管理
SpringData提供了默认的事务处理方式,即所有的查询均声明为只读事务。确保了单个请求过程数据的一致性。
对于自定义的方法,如需改变SpringData提供的事务默认方式,可以在方法上注解@Transactional声明进行多个Repository操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service层实现对多个Repository的调用,并在相应的方法上声明事务。
Repository概念:按照最初提出者的介绍,它是衔接数据映射层和域之间的一个纽带,作用相当于一个在内存中的域对象集合。客户端对象把查询的一些实体进行组合,并把它们提交给Repository。对象能够从Repository中移除或者添加,就好比这些对象在一个Collection对象上就行数据操作,同时映射层的代码会对应的从数据库中取出相应的数据。 从概念上讲,Repository是把一个数据存储区的数据给封装成对象的集合并提供了对这些集合的操作。 广义上可以理解为我们常说的DAO |
2)手动管理事务
1)dao层代码
说明:@Modifying注解
①在@Query注解中,编写JPQL实现DELETE和UPDATE操作的时候,必须加上@modifying注解,以通知SpringData这是一个DELETE或UPDATE操作。
②UPDATE或者DELETE操作需要使用事务,此时需要定义Service层,在Service层的方法上添加事务操作。
③注意JPQL不支持INSERT操作。
2)service层代码
使用@Transactional手动开启事务管理
@Transactional注解支持9个属性的设置,其中使用较多的三个属性:readOnly、propagation、isolation、rollbackFor:
- Propagation:用来枚举事务的传播行为;
不单独赋值,则走默认值:Propagation.REQUIRED,支持当前事务,如果当前没有事务,就新建一个事务。
即:@Transactional(propagation = Propagation.REQUIRED)
- Isolation:设置事务隔离级别;开发中默认即可。
控制事务隔离级别。默认跟数据库的默认隔离级别相同,数据库默认是读已提交
即:@Transactional(Isolation = READ_COMMITTED)
- readOnly:进行读写事务控制,因springdata已经默认开启,开发中可以忽略。
- rollbackFor:开发中必用,异常情况,数据整体回滚,保证数据一致性。
即:@Transactional(rollbackFor = Throwable.class)
@Transactional源码
3)对照表
1. spring七个事务传播属性:
(1) PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
(2)PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。
(3)PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。
(4)PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。
(5)PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
(6)PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。
(7)PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
备注:常用的两个事务传播属性是1和4,即PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW
2. 五个隔离级别:
(1) ISOLATION_DEFAULT
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应;
(2) ISOLATION_READ_UNCOMMITTED
这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
(3) ISOLATION_READ_COMMITTED
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
(4) ISOLATION_REPEATABLE_READ
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
(5) ISOLATION_SERIALIZABLE
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
除了防止脏读,不可重复读外,还避免了幻像读。