Spring事务传播属性和隔离级别

创业维艰
• 阅读 878

一、Spring事务传播属性(propagation)
1、propagration(事务传播属性)产生场景:
Service可以调用一个或者多个Dao方法,但是在使用Spring之前我们只能调用dao层,但是不能调用另外一个Service层中的方法
案例:在UserService.java中有方法 save().其中嵌套AddressService.java中update()。当UserService事务发生rollback时, AddressService事务也可以rollback或是commit。

public class UserService {


public void save() {
    
    UserService.update();//AddressService对象uodate操作
}

}
Spring事务传播属性和隔离级别

2、七个事务传播属性
REQUIRED: 需要事务,外部存在事务融入当前事务,外部没有事务,开启新的事务 【增删改操作常用】

SUPPORTS: 支持事务,外部存在事务融入当前事务,外部没有事务,不开启新的事 【查询操作常用 】

REQUIRES_NEW: 每次开启新的事务,如果外部存在事务外部事务挂起(暂停),开启新的事务运行,运行结束后恢复外部事务 【日志,流水操作】

案例分析:转账业务操作:转账,Account,App都是业务层

Spring事务传播属性和隔离级别

NOT_SUPPORTED: 不支持事务,如果外部存在事务外部事务挂起,已非事务方式运行.

NEVER: 不支持事务,存在事务报错

MANDATORY: 强制事务没有事务报错

NESTED: 嵌套事务,数据库不支持

二、隔离级别isolation
isolation:[ˌaɪsəˈleɪʃn]
:隔离

1、事务特性(事务的基本要素)
java培训中的事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功。其必须遵循四个原则(ACID )。

ACID指:原子性,一致性,隔离性 ,持久性
(1)原子性(Atomicity [ˌatəˈmɪsɪti]):
定义:指一个事务要么全部执行,要么不执行 ,也就是说一个事务不可能只执行了一半就停止了.
如:你从取款机取钱,这个事务可以分成两个步骤: 1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成。

(2)一致性(Consistency[kənˈsɪstənsi]):
定义:在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整性约束没有被破坏;
如:银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。

(3)隔离性(Isolation [ˌaɪsəˈleɪʃn]
定义:并发事务执行之间互不影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性;
(4)持久性(Durability[ˌdʊrəˈbɪləti]
定义:事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。

2、隔离性(事务的隔离级别)
isolation :隔离级别 多个客户端间操作的隔离性【Client——>Service】

(1)DEFAULT: 采用数据库默认隔离级别(Spring提供的)
Spring框架提供的隔离级别,当前使用的数据库对应的默认隔离级别
(2)READ_UNCOMMITTED: 读未提交
解析:不同客户端之间可以在一次事务中读取到其他客户端没有提交的事务
Spring事务传播属性和隔离级别

Spring事务传播属性和隔离级别

(3)READ_COMMITTED: 读提交 用来避免脏读现象出现的
read_ommited:oracle默认隔离级别
解析:不同客户端之间可以在一次事务中读取到其他客户端已经提交的事务
(4)REPEATABLE_READ: 可重复读主要是用来避免不可重复读现象出现的
单词:repeatable:[rɪˈpi:təbl] 可重复的
repeatable_read:mysql默认隔离级别
解析:在一次事务中一方更新,导致两次查询结果不一致这种情况叫不可重复读
Spring事务传播属性和隔离级别

(5)SERIALIZABLE : 序列化读 用来避免幻影读现象出现
幻影读概念:在一次事务中一方插入,导致两次查询结果不一致这种情况叫幻影读

解析:一个客户端在一次事务中多次读取一张表的数据 结果一致

隔离级别 隔离级别值 脏读 不可重复读 幻读
未提交读(Read-Uncommitted) 0 是 是 是
提交读(不可重复读 )(Read-committed) 1 否 是 是
可重复读(repeatable-read) 2 否 否 是
串行化 (serializable) 3 否 否 否
隔离级别的特点:隔离级别从低到高,级离级别越高越安全, 但是锁的内容越高,效率越低

三、读写和异常性
1、read-only(只读性):设置当前方法是否只读
true:只读

false:不是只读【默认值】

<tx:method name="save*" propagation="REQUIRES_NEW" read-only="true|false" isolation="SERIALIZABLE"/>
2、回滚性(rollback-for && no-rollback-for="")
rollback-for: 遇到什么类异常回滚

no-rollback-for: 遇到什么类异常不回滚

<tx:method name="save*" rollback-for="" no-rollback-for="" propagation="REQUIRES_NEW" read-only="true" isolation="SERIALIZABLE"/>
3、timeout 超时性
timeout: -1 永不超时
Spring事务传播属性和隔离级别

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
spring事物管理之传播行为和隔离级别
大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。事物注解方式:@Transactional当标于类前时,表示类中所有方法都进行事物处理例子:@TransactionalpublicclassTestServiceBeanimplementsTest
Easter79 Easter79
3年前
spring事务传播性(PROPAGATION)
spring事务传播性PROPAGATION\_REQUIRED简介加入当前已有事务;只有当前没有事务才启一个新的事务设计类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED类ServiceB,方法method
Easter79 Easter79
3年前
Spring的事务传播行为
先举一个Spring的嵌套例子ServiceA {    void methodA() {        ServiceB.methodB();    }}ServiceB {    void methodB();}事务传播属性可以在@Trans
Easter79 Easter79
3年前
Spring整合Hibernate 之上下文 Session 持久化对象和HibernateTemp
HibernateTemplate和session1.Spring的HibernateTemplate可以管理会话和事务,简化DAO实现.但使用HibernateTemplate意味着DAO必须依赖于Spring的
Easter79 Easter79
3年前
Spring事务回滚情况
spring默认非嵌套调用的情况Spring框架的事务基础架构代码将默认地只在抛出运行时和uncheckedexceptions时才标识事务回滚。也就是说,当抛出一个RuntimeException或其子类例的实例时。(Errors也一样默认地标识事务回滚。)从事务方法中抛出的Checkedexceptions将不
Stella981 Stella981
3年前
Spring 12 种 常用注解!
1.声明bean的注解@Component组件,没有明确的角色@Service在业务逻辑层使用(service层)@Repository在数据访问层使用(dao层)@Controller在展现层使用,控制器的声明(C)2.注入bean的注解@Autowired:由Spring提供@Inj
Easter79 Easter79
3年前
Spring事务的传播行为
\\\\\\\\\\\\\\\\\\\\sample\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ServiceA{      /\\      \事务属性配置为PROPAGATION\_REQUIRED    
Wesley13 Wesley13
3年前
Java高级特性—反射和动态代理
1).反射  通过反射的方式可以获取class对象中的属性、方法、构造函数等,一下是实例:2).动态代理  使用场景:      在之前的代码调用阶段,我们用action调用service的方法实现业务即可。    由于之前在service中实现的业务可能不能够满足当先客户的要求,需要我们重新修改servic
Easter79 Easter79
3年前
Spring事务的传播行为案例分析
!(https://oscimg.oschina.net/oscnet/4dbf52544247d9434c2ef8456efb077a97e.png)网上关于Spring事务传播性以及隔离性的文章漫天盖地,还有不负责任的直接复制名词意思,文章虽然很多却是看的云里雾里,我们今天将分别给出案例和大家一起学习。1、给出Spring事务的4
Wesley13 Wesley13
3年前
Spring事务管理
Spring提供了一流的事务管理。在Spring中可以支持声明式事务和编程式事务。    本章主要目标如下:     1,Spring事务    2,事务属性    3,事务管理器    4,声明式事务      1.1Spring的事务     事务管理在应用程序中起着至关重要的作用:它是一系列任务
LeeFJ LeeFJ
2年前
Foxnic-SQL (11) —— DAO 特性 : 事务管理
事务管理是任何一个数据层工具所必须的,FoxnicSQL既然是基于SpringJDBC的自然默认就支持@Transactional注解,另外FoxnicSQL的DAO对象还支持手动事务。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。手动事务手动事务通过DAO对象的beginTransaction()方法、commit()方法、rollback()方法完成,下面是一个手动事务的例子: