spring事务传播特性
什么是事物呢?
- 事务是一系列的动作(逻辑update,insert,delte…),它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,可以想一下0和1
,你把0变成1的过程就比作事务,这个过程中如果遇到问题就会失败就会变为原有状态0,而不会出现0.5等值,如果成功就是1,我们不难发现这个事务需要正确的执行有几个特性,那就是ACID; - 事物的特性
- Atomicity(原子性) :整个过程是完整的不会出现在一个过程中一部分成功一部分失败的情况
- consistency(一致性) :满足业务规则的一致性状态,如A给B转账A的钱减少了而B的钱没有增加(这就是不一致的情况)
- Isolation(隔离性):在进行并发操作的时候,事务之间是拥有各自的数据空间,各自的操作不会对其受到影响,但是这个也得根据隔离级别来判定(这就是事务的隔离级别特性),虽然隔离级别越高对数据的安全性越高,我们可以想一下这个数据完全被隔离起来,那就是这个数据完全不让别人操作,那不就是并发的性能就很低了(因为只允许一个地方来进行操作(锁))。
- durability(持久性)当这个事务完成操作的时候,这里保存的事务就会被持久化到存储器中(MySQL,H2,Oralce等)
也许你看到这个会有一个疑问,那就是那数据库在进行存储的时候会不会出现失败或者不遵循ACID呢? 那我们再想一下,那岂不就是数据库的几个特性了(想一下MYSQL的数据库的特性)
Spring的事务的传播特性
通过上面对事物的说明,有编程经验的人应该都很清楚为什么需要失误了吧?那就是为了防止出现业务逻辑上的出错,如算错账转错钱等。
- 在spring中有两种事务管理:
- 编程式事务管理:
- 将事务管理代码嵌入到业务逻辑中来控制事务的提交和事务的回滚,必须在每个事物操作中包含额外的事务管理代码如下:
- 声明式事务管理
- 配置:
- 配置DataSource
- 配置事务管理器
- 事务的传播特性
- 那些类那些方法使用事务
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。
根据代理机制的不同,Spring事务的配置又有几种不同的方式:
第一种方式:每个Bean都有一个代理
第二种方式:所有Bean共享一个代理基类
第三种方式:使用拦截器
第四种方式:使用tx标签配置的拦截器
第五种方式:全注解
注意点:
1、Spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit 或者rollback,取决于是否抛出runtime异常。
spring的事务传播属性
事务传播行为类型 | 说明 |
REQUIRED | 如果有事务在运行,当前的方法就在这个事务内运行;否则,就启动一个新的事务,并在自己的事务内运行; |
REQUIRES_NEW | 当前的方法必须启动新事务,并在它自己的事务内运行;如果有事务正在运行,应该将它挂起。 |
MANDATORY | 当前的方法必须运行在事务内部,如果没有正在运行的事务,将抛出异常。 |
SUPPORTS | 如果有事务在运行,当前的方法就在这个事务内运行;否则它可以不运行在事务中。 |
NOT_SUPPORTED | 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起。 |
NEVER | 当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常。 |
NESTED | 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则,就启动一个新的事务,并在它自己的事务内运行。 |
Spring @Transactional 注解的使用
https://www.jianshu.com/p/befc2d73e487