事务的隔离级别,四大特性,七大传播属性


一、事务的四大特性(ACID

  • 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
  • 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。
  • 隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
  • 持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

二、事务的隔离级别

  • 读未提交(Read uncommitted):读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据
  • 读已提交(Read committed):读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据
  • 重复读(Repeatable read):就是在开始读取数据(事务开启)时,不再允许修改操作
  • 串行化(Serializable): 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用

会产生的三种问题:

  • 脏读:事务A正添加一条记录,此时还未提交,事务B读取到该记录,事务B读取的就是脏数据,这就是脏读
  • 不可重复读:事务A开启并读取到一条记录余额为1000,还未提交,此时事务B开启事务,修改这条记录余额为2000并提交,事务A再次读取该记录余额为2000,一个事务中两次读取的余额不一样,这就是不可重复读
  • 幻读:事务A开启并读取到只有一条记录,还未提交,此时事务B开启事务,添加一条记录并提交,事务A再次读取发现有两条记录了,仿佛产生幻觉,这就是幻读
  • 这里注意:不可重复读针对的是修改操作,幻读针对的是新增或者删除记录的操作

三、事务的传播属性

  • PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
  • PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行
  • PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常
  • PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起
  • PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
  • PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常
  • PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM