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执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下
脏读、可重复读、幻读都可以避免
数据库隔离支持
级别 | mysql | oracle |
---|---|---|
读未提交(READ_UNCOMMITED) | 支持 | 不支持 |
读已提交(READ_COMMITED) | 支持 | 支持(默认) |
可重复读(REPEATABLE_READ) | 支持(默认) | 不支持 |
串行化(SERIALIZABLE) | 支持 | 支持 |