mysql事务的基本要素与事务隔离级别详解

 更新时间:2023年08月15日 09:22:29   作者:SSS_HuLiang  
这篇文章主要介绍了mysql事务的基本要素与事务隔离级别详解,事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,需要的朋友可以参考下

mysql事务(ACID,脏读,不可重复读,幻读,隔离级别)

何为事务?事务是执行某个任务时的一系列操作,是一组SQL语句,多条SQL的集合。

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

一、事务的基本要素(ACID)

1、原子性(Atomicity)

原子,是物质构成的基本单位,不可分割,也就是说事务是一个不可分割的整体。

事务里面的SQL要么全执行,要么全不执行,不可能停滞在中间环节。

事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。

例子:就拿A与B转账为例,一条语句从A里扣钱,另一条语句往B身上加钱,如果这两条语句不能全部执行,而是成功了一部分,那事务就没有存在的意义了。

2、一致性(Consistency)

事务开始前和结束后,数据库的一致性约束没有被破坏。

例子:比如A向B转账100元,而余额里面只有90元,B已经收到钱,A开始扣钱,发现钱不够,然后事务需要回滚,这是原子性!!!!(要么全部执行—转账成功一加一减,要么全部失败—转账失败,金额不变)。

所以不管是成功,还是失败,数据都是一致的,什么意思呢?

转账成功,A减了钱,B加了钱,数据一致。转账失败,A和B的钱都没变化,数据一致。A减了钱,B却没收到,或者A没减钱,B收到了,那数据就是不一致了。

一致性其实是由原子性(执行成功,执行失败数据一致),隔离性(其他事务不会影响数据一致),持久性(需要数据持久化)决定的,也就是C是由AID做基础的,保证了数据的一致性。

3、隔离性(Isolation)

同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。

例子:A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

再比如A用户读取订单列表的时候,B用户操作,把某条订单给删了,就造成了脏读,A读的数据是错误的。

4、持久性(Durability)

事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

数据到物理存储中,已经持久化,所以有持久性。

二、事务的并发问题

1、脏读(DirtyReads)

读取了未提交的数据:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

例子:B修改了订单详情,还未提交事务,A查看详情(读的是B修改后的数据),此时B事务出错,进行回滚。A查看的数据就是脏的(假数据)。

2、不可重复读(Non-RepeatableReads)

前后多次读取,数据内容不一致:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

例子:事务A修改用户姓名,此时年龄为20,事务B修改年龄为25,等事务A修改完再查询,发现年龄由20变成了25。此时事务B回滚,A再返回页面发现年龄变回了20,多次读取,年龄20-25-20,重复读出来的数据内容不一致。

3、幻读(PhantomRead)

前后多次读取,数据内容不一致

例子:A将数据库中所有学生的成绩从具体分数重置为0,但是B就在这个时候插入了一条具体分数100的记录,当A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。 小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

三、mysql事务隔离级别

有四种隔离级别,用来解决数据库操作中产生的各种问题。java中Connection类里面定义了对应的数字,分别是

1、读未提交(Readuncommitted)

所有事务能够读取其他事务未提交的数据,会造成脏读。因此在该种隔离级别下,造成脏读、不可重复读和幻读。

2、读已提交(Readcommitted)

Oracle和SQLServer默认的隔离级别②

所有事务只能读取其他事务已经提交的内容,能够彻底解决脏读的现象。但在这种隔离级别下,会出现一个事务的前后多次的查询中却返回了不同内容的数据的现象,也就是出现了不可重复读。

3、可重复读(Repeatableread)

mysql默认隔离级别④

所有事务前后多次的读取到的数据内容是不变的,也就是某个事务在执行的过程中,不允许其他事务进行update(delete也属于update范畴)操作,但允许其他事务进行add操作,造成某个事务前后多次读取到的数据总量不一致的现象,从而产生幻读。

4、可串行化(Serializable)

所有的事务就像被串起来,有秩序地执行,类似java的synchronized同步。所以他们之间不存在冲突,从而能有效地解决脏读、不可重复读和幻读的现象。

但是安全和效率不能兼得,会导致大量的操作超时和锁竞争,从而大大降低数据库的性能,一般不使用这样事务隔离级别。

事务隔离级别对应表

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

到此这篇关于mysql事务的基本要素与事务隔离级别详解的文章就介绍到这了,更多相关mysql事务的基本要素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用mysql workbench自动生成ER图的实现步骤

    使用mysql workbench自动生成ER图的实现步骤

    MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具,它是著名的数据库设计工具DBDesigne4的继任者,可以通过MySQL Workbench设计和创建新的数据库图示,本文给大家介绍了使用mysql workbench自动生成ER图的实现步骤,需要的朋友可以参考下
    2024-06-06
  • lnmp重置mysql数据库root密码的两种方法

    lnmp重置mysql数据库root密码的两种方法

    这篇文章给大家介绍了lnmp重置mysql数据库root密码的两种方法,第一种方法通过脚本重置密码,第二种方法通过命令修改,具体操作方法大家参考下本文
    2017-07-07
  • Mac下安装mysql5.7.18的详细步骤

    Mac下安装mysql5.7.18的详细步骤

    这篇文章主要为大家详细介绍了]Mac下安装mysql5.7.18的详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • clickhouse分布式表的操作示例详解

    clickhouse分布式表的操作示例详解

    这篇文章主要为大家介绍了clickhouse分布式表的操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • MySQL的索引失效的原因实例及解决方案

    MySQL的索引失效的原因实例及解决方案

    这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引选择性低、覆盖索引不足和统计信息不准确等问题,感兴趣的朋友一起看看吧
    2024-12-12
  • MySQL存储过程实践(in、out、inout)

    MySQL存储过程实践(in、out、inout)

    文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT,并提供了示例代码,最后,文章还解决了存储过程名已存在的报错问题
    2025-11-11
  • ERROR 2002 (HY000): Can''t connect to local MySQL server through socket ''/tmp/mysql.sock''

    ERROR 2002 (HY000): Can''t connect to local MySQL server thr

    mysql 支持 socket 和 TCP/IP 连接。那么 mysql.sock 这个文件有什么用呢?本文给大家介绍的非常详细,需要的朋友参考下吧
    2019-11-11
  • MySQL主从复制延迟原因以及解决方案

    MySQL主从复制延迟原因以及解决方案

    这篇文章主要介绍了MySQL主从复制延迟原因以及解决方案,帮助大家更好的理解和使用数据库,感兴趣的朋友可以了解下
    2020-09-09
  • 大厂面试必问题之MySQL大文本如何进行处理

    大厂面试必问题之MySQL大文本如何进行处理

    这篇文章主要介绍了大厂面试必问题之MySQL大文本如何进行处理的相关资料,面试者需要展示对MySQL索引机制的深入理解,并提出合适的索引类型和创建策略,需要的朋友可以参考下
    2025-01-01
  • 详解MySQL幻读及如何消除

    详解MySQL幻读及如何消除

    这篇文章主要介绍了详解MySQL 幻读及解决方法,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03

最新评论