mysql学习之事务

mysql数据库隔离级别及其原理、Spring的7种事物传播行为

以下内容大部分来自它https://www.cnblogs.com/wzk-0000/p/9928883.html
一、事务的基本要素(ACID)(事务的特征)

  1. 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
  2. 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  3. 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
    二、事务的隔离性,常见并发异常的理解
    :表中,时刻是一瞬间的

第一类丢失更新:事务的回滚时发送的问题
在这里插入图片描述
第二类丢失更新:事务的提交时发生的问题
在这里插入图片描述
脏读:
在这里插入图片描述
不可重复读:读取不同结果在毫秒内,如果不是一瞬间还没问题
在这里插入图片描述
幻读:
在这里插入图片描述
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

四种隔离级别

  1. 读不提交(Read Uncommited,RU)
    这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用。
  2. 读提交(Read commited,RC)
    本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)
  3. 可重复读(Repeatable Read,RR)【MySQL 默认的级别】
    在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同一个事务同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
  4. 串行化(SERIALIZABLE)。
    读操作会隐式获取共享锁,可以保证不同事务间的互斥
    在这里插入图片描述
    不同隔离级别能处理的异常
    在这里插入图片描述

4种隔离级别的相应原理总结如下:

READ_UNCOMMITED 的原理:

  • 事务对当前被读取的数据不加锁;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级共享锁,直到事务结束才释放。
    表现:
  • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,能读到事务2对该记录的修改版本,即使该修改尚未被提交。
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

READ_COMMITED 的原理:

  • 事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
    表现:
  • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的只能是事务2对其更新前的版本,要不就是事务2提交后的版本。
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

REPEATABLE READ 的原理:

  • 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
    表现:
  • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的仍然是第一次读取的那个版本。
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束

SERIALIZABLE 的原理:

  • 事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;
  • 事务在更新数据时,必须先对其加 表级排他锁 ,直到事务结束才释放。
    表现:
  • 事务1正在读取A表中的记录时,则事务2也能读取A表,但不能对A表做更新、新增、删除,直到事务1结束。
  • 事务1正在更新A表中的记录时,则事务2不能读取A表的任意记录,更不可能对A表做更新、新增、删除,直到事务1结束。

注释:

  1. 共享锁:称为读锁,简称S锁,顾名思义,共享锁就是如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。共享锁也属于悲观锁的一种
  2. 排他锁:又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能给该数据加其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

Spring的7种事物传播行为:

由@Transaction(Propagation=XXX)设置决定:

  • REQUIRED(required):如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。即:不管内部事物还是外部事物,只要发生异常,全部回滚,默认是这种传播
  • REQUIRES_NEW(requires_new):新建事务,如果当前存在事务,把当前事务挂起。
  • SUPPORTS(supports):支持当前事物,如果没有事物,就以非事物方式执行。
  • MANDATORY(mandatory):使用当前事物,没有就抛出异常
  • NOT_SUPPORTED(not_supported):使用非事物的方式执行,如果当前存在事物,就把当前事物挂起
  • NEVER(never):以非事物方式执行,如果当前事物存在,则抛出异常
  • NESTED(nested):如果当前存在事物,则嵌套事物内部执行;如果当前没有事物,则执行与PROPAGATION_REQUIRED类似操作

自我理解:事务的传播机制解决的是有事务的方法a调用有事务的方法b,用谁的事务,或者调用的是没事务的方法b是创建一个还是用事务的方法b的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值