深入解析MySQL 事务

 更新时间:2022年01月19日 16:50:11   作者:小写丶H  
这篇文章主要给大家分享的是mysql事务解析,事务(transaction)是业务逻辑的一个基本的单元组成,下面文章围绕mysql事务的相关资料展开详细内容,需要的朋友可以参考一下希望对大家有所帮助

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

事务的四大特性 ( ACID )

原子性(Atomicity):一个事物是一个不可分割的单位,要么全都执行,要么都不执行;

一致性(Consistency):事务执行前后,数据处于合法的状态;

持久性(Isolation):事务执行完后,数据的修改是持久的,不会因为其他操作或故障而对其产生影响;

隔离性(Durability):多个事务并发执行的,事务之间不互相干扰。

假如事物的一个操作整体(动作A,B),动作A,执行完了,动作B,执行到一半,执行过程出错,这时怎么办?有回滚机制,有个日志会记录这些操作,记录数据修改前和数据修改后的值。

脏读

事务A正在修改数据(但是没有提交),事务B就读取了这里的数据,此时事务B读取的操作称为脏读。 解决办法:给写操作加锁,当事务A在写数据的时候,事务B无法读取。

不可重复读

事务A修改数据之后提交了数据“name=L”,然后事务B就读取数据,但是此时A觉得修改的数据不满意“name=H”,继续修改提交了,此时事务B再次读取,发现,啊,怎么数据不一样了。这就是不可重复读的问题。 解决办法:给写操作加锁的同时,给读操作也加锁,当事务A在写的时候,事务B不可以读,事物B在读的时候,事物A也不可以写。

幻读

虽然已经给写操作加锁,和读操作加锁,但是会有种情况,事务B在读的时候,事务A无法修改name,但是事务A可以再写一个age,当事务B再次读取数据的时候发现,咦,怎么多了条数据。 解决办法:只能严格的串行化执行。(并发程度最低,效率也最低,但是数据的可靠性最高)

这里很容易搞混不可重复读和幻读。其实只需要理解,不可重复读是修改数据,数据的条数不变;幻读是增加或者删除数据,数据的内容不变,条数发生改变。

MySQL的隔离级别

读未提交(read-uncommitted):会有脏读,不可重复读,幻读问题 不可重复读(read-committed):会有不可重复读,幻读问题 可重复读(repeatable-read):会有幻读问题 串行化 (serializable):解决这三个问题

事务的隔离级别并不是越高越好,但事务的隔离级别越高,那么并发性就越低,效率越低,数据的可靠性就会越高。

MySQL8开始,用SELECT@@GLOBAL.transaction_isolation,@@transaction_isolation;查询隔离级别(这里是是MySQL5)

这里我们可以看到MySQL的全局隔离级别和当前会话隔离级别皆是REPEATABLE一READ(可重复读),不同的数据库有不同的默认隔离级别,而且我们也可以自行修改它。

通过如下命令可以修改隔离级别(建议在修改时修改当前 session 隔离级别即可,不用修改全局的隔离级别):

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

注意,如果只是修改了当前 session 的隔离级别,则换一个 session 之后,隔离级别又会恢复到默认的隔离级别,所以我们测试时,修改当前 session 的隔离级别即可。

到此这篇关于深入解析MySQL 事务的文章就介绍到这了,更多相关MySQL 事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql执行计划Explain解读

    mysql执行计划Explain解读

    在数据库操作中,理解Explain执行计划对于性能优化至关重要,Explain展示了MySQL如何执行查询,包括选择哪些索引,如何连接表,以及估计的行数等,Select类型、访问表的方式、使用的索引、以及额外的执行信息,都是优化查询时需要考虑的因素
    2024-10-10
  • MySQL中INSERT+SELECT的使用方式

    MySQL中INSERT+SELECT的使用方式

    MySQL的INSERT INTO SELECT FROM语句允许用户通过一条SQL语句实现从一个或多个表中查询数据并将结果插入到另一个表中,这种方式特别适用于需要将数据从一张表迁移到另一张表,或者基于多表查询结果创建新表的场景
    2024-10-10
  • 详解Mysql之mysqlbackup备份与恢复实践

    详解Mysql之mysqlbackup备份与恢复实践

    这篇文章主要介绍了详解Mysql之mysqlbackup备份与恢复实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL定义异常和异常处理详解

    MySQL定义异常和异常处理详解

    这篇文章主要为大家详细介绍了MySQL定义异常和异常处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • MySQL闪回(flashback)原理与实战

    MySQL闪回(flashback)原理与实战

    摘要: 本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较。这是目前为止,MySQL 闪回领域第一篇全面深入的实战总结。
    2017-01-01
  • MySQL之表碎片化的问题解决

    MySQL之表碎片化的问题解决

    MySQL数据库的碎片是由于频繁的增删改查操作导致的数据块不连续或不规则分布,本文主要介绍了MySQL之表碎片化的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • mysql设置某字段不能重复问题

    mysql设置某字段不能重复问题

    这篇文章主要介绍了mysql设置某字段不能重复问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 初学者从源码理解MySQL死锁问题

    初学者从源码理解MySQL死锁问题

    这篇文章主要讲的是如何通过调试 MySQL 源码,知道一条 SQL 真正会拿哪些锁,不再抓虾,瞎猜或者何登成大神没写过的场景就不知道如何处理了,下面小编来和大家一起学习学习
    2019-05-05
  • MySQL日志维护策略汇总

    MySQL日志维护策略汇总

    这篇文章主要介绍了MySQL日志维护策略汇总,需要的朋友可以参考下
    2015-08-08
  • 在ubuntu中重置mysql服务器root密码的方法

    在ubuntu中重置mysql服务器root密码的方法

    在ubuntu下安装了mysql 5 server,结果不知道什么原因,安装时输入的root帐号密码在使用时无论如何都不能通过数据库服务器的验证。无奈只有重置mysql的root帐号密码。查了一下,用了以下方法成功的重置了root帐号密码
    2012-10-10

最新评论