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的。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事务是一组关联的SQL操作,它们被看作是一个整体,要么全部执行成功,要么全部回滚。事务具有四个ACID属性:原子性、一致性、隔离性和持久性。 首先,原子性意味着事务中的所有操作要么全部成功执行,要么全部回滚。如果事务中的一个操作发生错误,导致整个事务回滚到之前的状态。 其次,一致性表示事务执行完毕后,数据库进入一个有效的状态。在事务开始之前和结束之后,数据库的完整性约束必须得到保持,确保数据的正确性。 隔离性是指每个事务的操作在执行过程中是相互隔离的,不互相干扰。事务并发执行时可能出现的问题包括脏读、不可重复读和幻读。为了解决这些问题,数据库系统提供了四个隔离级别:未提交读取、已提交读取、可重复读取和串行化。 最后,持久性是指一旦事务被提交,对数据库的修改将永久保存,即使在系统故障的情况下也是如此。数据库系统通过将事务的日志记录到磁盘上来实现持久性。 在MySQL中,可以使用START TRANSACTION语句来开始一个事务,COMMIT语句来提交一个事务,ROLLBACK语句来回滚一个事务。此外,可以使用事务控制语句来设置隔离级别,如SET TRANSACTION ISOLATION LEVEL。要保证事务的正确性和性能,还应注意事务的边界,避免事务嵌套过深。 深入学习MySQL事务需要理解事务的四个ACID属性以及MySQL事务控制语句。此外,还需要了解事务的隔离级别,以便在并发执行的情况下避免数据不一致的问题。掌握MySQL事务的概念和操作方法,可以保证数据库操作的一致性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值