Spring支持的常用数据库事务传播属性和事务隔离级别

Spring 事务

使用注解@Transaction开启事务

事务的属性

1、propagation:用来设置事务传播行为

事务的传播行为:一个方法运行在一个开启了事务的事务的方法时,当前方法是使用原来的事务还是新开启一个事务。

Propagation.REQUIRED:默认值,使用原来的事务。
Propagation.REQUIRED_NEW:将原来的事务挂起,新开启一个事务。

2、isolation:事务隔离级别

	Isolation.REPEATABLE_READ:可重复读,Mysql默认隔离级别。
	Isolation.READ_COMMITED:读已提交,Oracle默认隔离级别,开发时通常使用的隔离级别

数据库事务并发问题

两个事务 Transacation01和Transaction02

1)脏读(读取更新未提交的值)

①Transaction01将某条记录中的AGE值从20修改为30
②Transaction02读取了Transaction01更新后的值30
③Transaction01回滚,AGE值恢复到20
④Transaction02读取到的30就是一个无效的值

2)不可重复值

①Transaction01读取AGE值为20
②Transaction02将AGE值修改为30
③Transaction01再次读取AGE值为30,和第一次读取的不一致

3)幻读

①Transaction01读取表中的一部分数据
②Transaction02在表中添加了一行数据
③Transaction01再次读取该表时多出了一行

事务隔离级别

数据库系统必须具有有隔离并发运行各个事务的能力,使它们不会互相影响,避免各种并发问题,一个事务与其他事务隔离的程度称为隔离别。SQL标准规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
1)读未提交:READ_UNCOMMITED。
允许Transaction01读取Transaction02未提交的数据
脏读、可重复读、幻读都无法避免
2)读已提交:READ_COMMITED
要求Transaction01只读取Transaction02已提交的修改
可避免脏读
3)可重复读:REPEATABLE_READ
确保Transaction01可以多次从一个字段读取到相同的值,,Transaction01执行期间禁止其它事务对这个字段进行更新
脏读、可重复读可避免
4)串行化:SERIALIZABLE
确保Transaciton01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下
脏读、可重复读、幻读都可以避免		
数据库隔离支持
级别mysqloracle
读未提交(READ_UNCOMMITED)支持不支持
读已提交(READ_COMMITED)支持支持(默认)
可重复读(REPEATABLE_READ)支持(默认)不支持
串行化(SERIALIZABLE)支持支持
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值