spring事务传播特性:spring
事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为:数据库
-
- propagation_requierd:若是当前没有事务,就新建一个事务,若是已存在一个事务中,加入到这个事务中,这是最多见的选择。
- propagation_supports:支持当前事务,若是没有当前事务,就以非事务方法执行。
- propagation_mandatory:使用当前事务,若是没有当前事务,就抛出异常。
- propagation_required_new:新建事务,若是当前存在事务,把当前事务挂起。
- propagation_not_supported:以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。
- propagation_never:以非事务方式执行操做,若是当前事务存在则抛出异常。
- propagation_nested:若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则执行与propagation_required相似的操做
Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的状况。假设 ServiveX#methodX() 都工做在事务环境下(即都被 Spring 事务加强了),假设程序中存在以下的调用链:Service1#method1()->Service2#method2()->Service3#method3(),那么这 3 个服务类的 3 个方法经过 Spring 的事务传播机制都工做在同一个事务中。并发
1.什么是事务:ui
事务是程序中一系列严密的操做,全部操做执行必须成功完成,不然在每一个操做所作的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。事务
2.事务特性:ci
事务特性分为四个:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)简称ACID。it
- 原子性(Atomicity):事务是数据库逻辑工做单元,事务中包含的操做要么都执行成功,要么都执行失败。
- 一致性(Consistency):事务执行的结果必须是使数据库数据从一个一致性状态变到另一种一致性状态。当事务执行成功后就说数据库处于一致性状态。若是在执行过程当中发生错误,这些未完成事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于不一致状态。
- 隔离性(Isolation):一个事务的执行过程当中不能影响到其余事务的执行,即一个事务内部的操做及使用的数据对其余事务是隔离的,并发执行各个事务之间无不干扰。
- 持续性(Durability):即一个事务执一旦提交,它对数据库数据的改变是永久性的。以后的其它操做不该该对其执行结果有任何影响。
3.事务的隔离级别:io
事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读提交)、read repeatable(读重复)、serializable(序列化),这四个级别能够逐个解决脏读、不可重复读、幻读这几类问题。table

- read uncommited:是最低的事务隔离级别,它容许另一个事务能够看到这个事务未提交的数据。
- read commited:保证一个事物提交后才能被另一个事务读取。另一个事务不能读取该事物未提交的数据。
- repeatable read:这种事务隔离级别能够防止脏读,不可重复读。可是可能会出现幻象读。它除了保证一个事务不能被另一个事务读取未提交的数据以外还避免了如下状况产生(不可重复读)。
- serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读以外,还避免了幻象读。
- 脏读、不可重复读、幻象读概念说明:
-
- 脏读:指当一个事务正字访问数据,而且对数据进行了修改,而这种数据尚未提交到数据库中,这时,另一个事务也访问这个数据,而后使用了这个数据。由于这个数据尚未提交那么另一个事务读取到的这个数据咱们称之为脏数据。依据脏数据所作的操做肯能是不正确的。
- 不可重复读:指在一个事务内,屡次读同一数据。在这个事务尚未执行结束,另一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,因为第二个事务的修改第一个事务两次读到的数据多是不同的,这样就发生了在一个事物内两次连续读到的数据是不同的,这种状况被称为是不可重复读。
- 幻象读:一个事务前后读取一个范围的记录,但两次读取的纪录数不一样,咱们称之为幻象读(两次执行同一条 select 语句会出现不一样的结果,第二次读会增长一数据行,并无说这两次执行是在同一个事务中)