MySQL事务与隔离级别的使用基础理论

 更新时间:2023年02月20日 10:26:21   作者:绿仔牛奶_  
这篇文章主要介绍了MySQL事务的隔离级别详情,事务隔离级别越高,为避免冲突所花费的性能也就越多,即效率低。在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别

什么是事务

事务就是一组操作的集合,事务将整组操作作为一个整体,共同提交或者共同撤销

这些操作只能同时成功或者同时失败,成功即可提交事务,失败就执行事务回滚

MySQL的事务默认是自动提交的,一条语句执行成功,MySQL将会隐式的提交事务

以转账为例,张三向李四转账1000元

这个整体行为包含三个操作:首先查询张三账户的余额,其次将张三账户余额-1000,最后将李四账户余额+1000。事务就是将这三个操作看作最小提交单元,就是一荣俱荣一损俱损。

-- 查看事务管理状态  1-自动  0-手动
select @@autocommit;
-- 设置事务手动管理
set @@autocommit = 0;
-- 开启事务
start transaction;
-- 开启事务:start transaction 或者 begin
select money from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
-- 事务提交
commit;
-- 事务回滚
rollback;

事务四大特性ACID

原子性Atomicity:一组操作为最小执行单元,只能全部执行成功或者全部失败

一致性Consistency:事务完成后,所有数据都要保持一致状态

一致性表示事务完成后,数据操作前后符合逻辑运算,状态一致

隔离性Isolation:是指在并发操作数据库时,各个事务之间不会相互影响

持久性Durability:事务一旦提交或回滚,对于数据库的修改将会永久保存

并发事务问题

脏读

两个事务A和B在并发下操作数据库中的同一数据时,当事务A对数据进行了修改但是还没有commit的同时,事务B对该数据进行了select,此时事务B读取到的数据就是不准确的。这种情况叫做脏读

事务B读取到了事务A修改但还未提交的数据---->脏读

不可重复读

同样事务AB并发下操作数据库中同一数据,首先事务A对该数据进行查询,查询之后又进行了其他操作。与此同时,事务B执行了更新操作并且成功commit。那么当事务A再次对数据库查询的时候就会出现与上次读取到的数据不一致的情况

幻读

事务AB并发下操作数据库中同一数据,事务A首先查询了数据库中是否有id=1的数据,没有就插入。那么此时事务A未查询到该数据存在,同时事务B执行了插入操作插入了id=1的数据并且提交。那么事务A再去插入的时候则会报主键冲突的错误,但是当事务A再一次去查的时候发现id=1的数据仍然是不存在( 前提是已经解决了不可重复读的问题,一个事务多次访问同一数据的结果是一致的 ),这种情况就称之为幻读

事务隔离级别

隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted(读未提交)×××
Read committed(oracle默认)(读已提交)××
Repeatable Read(mysql默认)(可重复读)×
Serializable(可序化)

× --> 无法解决 √ --> 可以解决

在sql中查看当前事务隔离级别

select @@transaction_isolation;

设置当前事务隔离级别

-- 设置事务隔离级别
set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};

session是指尽在当前会话中使用该事务隔离级别,global表示全局有效

四种事务隔离级别当中,Serializable可序化级别最高。要求序列化执行sql指令,事务只能一个接一个的执行,不允许并发执行。性能低下

而Read Uncommitted读未提交性能最好,但是存在脏读问题等

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

相关文章

  • MySQL示例DTID主从原理解析

    MySQL示例DTID主从原理解析

    这篇文章主要介绍了MySQL示例DTID主从原理解析,其实包含了详细的使用方法说明,有需要的朋友可以借鉴参考下,希望可以有所帮助,感谢阅读
    2021-09-09
  • 详解Mysql order by与limit混用陷阱

    详解Mysql order by与limit混用陷阱

    这篇文章主要介绍了详解Mysql order by与limit混用陷阱,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Windows下MySQL主从复制的配置方法

    Windows下MySQL主从复制的配置方法

    MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
    2020-04-04
  • mysql 字段as详解及实例代码

    mysql 字段as详解及实例代码

    这篇文章主要介绍了mysql 字段as详解,并附实例代码的相关资料,需要的朋友可以参考下
    2016-09-09
  • Windows版mysql 8.0.28 安装配置方法图文教程

    Windows版mysql 8.0.28 安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows版mysql 8.0.28 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • mysql查询条件not in 和 in的区别及原因说明

    mysql查询条件not in 和 in的区别及原因说明

    这篇文章主要介绍了mysql查询条件not in 和 in的区别及原因说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 深入理解Mysql中的MVCC

    深入理解Mysql中的MVCC

    这篇文章主要介绍了深入理解Mysql中的MVCC,同样的sql查询语句在一个事务 里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果, 这个隔离性就是靠MVCC机制来保证的,需要的朋友可以参考下
    2023-09-09
  • mysql中GROUP_CONCAT函数使用技巧及问题详解

    mysql中GROUP_CONCAT函数使用技巧及问题详解

    这篇文章主要给大家介绍了关于mysql中GROUP_CONCAT函数使用技巧及问题的相关资料,GROUP_CONCAT是MySQL中的一个聚合函数,它用于将多行数据按照指定的顺序连接成一个字符串并返回结果,需要的朋友可以参考下
    2023-11-11
  • MySQL 数据类型之字符串、数字、日期详解

    MySQL 数据类型之字符串、数字、日期详解

    MySQL 提供了多种数据类型,每种类型都有其适用场景,合理选择数据类型可以提升存储效率、优化查询性能,并避免精度损失,这篇文章主要介绍了MySQL数据类型详解:字符串、数字、日期,需要的朋友可以参考下
    2025-04-04
  • mysql分组取每组前几条记录(排名) 附group by与order by的研究

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下
    2012-10-10

最新评论