事务的特性及隔离级别、Spring中的事务传播特性

目录

1. 什么是事务

2. 事务的特性

3. 事务的安全性问题

4. 事务的隔离级别

5. Spring事务的传播行为(传播特性)

内容复制于:spring的4种事务特性,5种隔离级别,7种传播行为_张超帅的博客-CSDN博客

1. 什么是事务

事务是指逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败。

2. 事务的特性

  1. 原子性 (atomicity):强调事务的不可分割。
  2. 一致性 (consistency):事务的执行的前后数据的完整性保持一致。
  3. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰。
  4. 持久性(durability) :事务一旦结束,数据就持久到数据库。

3. 事务的安全性问题

  • 脏读:一个事务读到了另一个事务的未提交的数据。
    •   例如B事务修改数据库X,在未提交前A事务读取了X的值,而B事务发生了回滚。
  • 不可重复读:在同一个事务中对同一条数据读取两次,得到的结果不同。
    • 一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致。
    • 例如A事务读取X,在中间过程中B事务修改了X的值,事务A再次读取X时值发生了改变。
  • 幻读:一个事务读取两次,得到的结果集数量不同。
    • 一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致。
    • 例如A事务搜索数据时有10条数据,在这时B事务插入了一条数据,A事务再搜索时发现数据有11条了。

4. 事务的隔离级别

  1. 未提交读(read uncommited):不能避免任何安全性问题。脏读,不可重复读,幻读都有可能发生
  2. 已提交读 (read commited):可避免脏读。但是不可重复读和虚读有可能发生
  3. 可重复读 (repeatable read):可避免脏读、不可重复读。但是幻读有可能发生.
  4. 可串行化(serializable):可避免脏读、不可重复度、幻读。

Mysql 默认:可重复读
Oracle 默认:读已提交

数据库隔离级别所起到的作用
脏读不可重复读幻读
Read Uncommited不可避免不可避免不可避免
Read Commited可避免不可避免不可避免
Repeatable Read可避免可避免不可避免
Serializable可避免可避免可避免

5. Spring事务的传播行为(传播特性)

  • 保证同一个事务中
  1. PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
  2. PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
  3. PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
  • 保证没有在同一个事务中
  1. PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务,也就是该传播级别每次执行都会创建新事务,并同时将上下文中的事务挂起,执行完当前线程后再恢复上下文中事务。(子事务的执行结果不影响父事务的执行和回滚)。
  2. PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
  3. PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
  4. PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

6.Spring事务传播和隔离级别配置

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class,timeout=1,isolation=Isolation.DEFAULT)

  1. 事务的传播性:@Transactional(propagation=Propagation.REQUIRED) 如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
  2. 事务的超时性:@Transactional(timeout=30) //默认是30秒
  3. 事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
  4. 回滚:指定异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
  5. 只读:@Transactional(readOnly=true)该属性用于设置当前事务是否为只读事务,设置为true表示只读
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值