MySQL事务的ACID特性以及并发问题方案


Posted in MySQL onJuly 15, 2022

一、事务的概念

一个事务是由一条或多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中所有操作都正常执行完了,整个事务才会被提交给数据库,如果有部分事务处理失败,那么事务就要回滚到最初的状态,因此,事务要么全部执行成功,要么全部失败。

所以要记住事务几个基本概念,如下:

事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果,保证事务执行的原子操作。事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写会磁盘上。事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。

比如转账业务需要多条SQL语句共同完成,只有这些SQL都执行成功才算业务成功了。

MySQL事务的ACID特性以及并发问题方案

事务处理有三个状态:

begin:开启一个事务要执行的全部sql语句都成功了,然后commit提交一个事务如果其中任何一条SQL语句由于停电、或者服务器出错,导致SQL执行异常,那事务就没有提交,事务会回滚(rollback),数据将恢复到事务开始前的状态

这是存储引擎来保证的(redo log和undo log保证的)

MySQL事务的ACID特性以及并发问题方案

MyISAM存储引擎不支持事务,InnoDB存储引擎支持事务、支持行锁。

show engines\G查看当前数据库支持哪些存储引擎。

MySQL事务的ACID特性以及并发问题方案

select @@autocommit;查看对事务提交状态的设置

MySQL事务的ACID特性以及并发问题方案

数据库引擎可以通过命令临时修改,或者通过配置文件永久修改。

如果说我们业务上涉及了事务,我们一般会在代码上控制这个变量,一般来说,我们的事务由多条SQL组成,要满足事务的原子性操作,所以我们设置为手动提交。业务都成功,则提交这个事务;如果业务中间出现失败,就回滚1个事务。

MySQL事务的ACID特性以及并发问题方案

二、ACID特性

每一个事务必须满足下面的4个特性:

事务的原子性(Atomic):事务是一个不可分割的整体,事务必须具有原子特性,及当事务修改时,要么全执行,要么全不执行,即不允许事务部分的完成。事务的一致性(Consistency):一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务。(一致性不仅仅体现在事务里面,包括存储层引入MySQL为了提高热点数据的访问效率一般都会加一个缓存层Redis或者Memery cache对热点数据做缓存,这就涉及了缓存层和数据库DB层的数据一致性问题)事务的隔离性(Isolution):当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与其他事务的操作隔离起来,不被其他正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响。隔离级别:数据的安全性和事务的并发性。隔离越严格,安全性越高,并发性越低(就是并发控制,保证数据安全)事务的持久性(Durability):事务完成以后(事务commit成功),DBMS保证它对数据库中的数据的修改时永久性的,即使数据库因为故障出错,也应该能够恢复数据。

MySQL事务的ACID特性以及并发问题方案

MySQL最重要的是日志,不是数据!

事务的ACD特性是由MySQL的redo log和undo log机制来保证的;I隔离性是由mysql事务的锁机制来实现保证的。

三、事务并发存在的问题

事务处理不经隔离,并发执行事务时通常会发生以下问题:

脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据(事务B读取了事务A尚未提交的数据不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读到不同的数据。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再去读该数据,发现前后两次读的数据不一样。(事务B读取了事务A已提交的数据虚读(Phantom Read)幻读:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据

脏读必须杜绝,因为事务没有commit。在有些场景下,不可重复读和幻读是可以允许的(事务已经commit),不一定非要杜绝(通过设置不同的隔离级别解决),由应用场景需求决定。

四、事务相关命令

select @@autocommit;查看MySQL是否自动提交事务

MySQL事务的ACID特性以及并发问题方案

0表示手动提交事务,1表示自动提交事务,设置事务提交方式为手动提交(只影响当前session):

MySQL事务的ACID特性以及并发问题方案

MySQL事务的ACID特性以及并发问题方案

到此这篇关于MySQL事务的ACID特性以及并发问题方案的文章就介绍到这了,更多相关MySQL事务ACID特性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
MySQL学习总结-基础架构概述
Apr 05 MySQL
解决MySQL存储时间出现不一致的问题
Apr 28 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL 不等于的三种使用及区别
Jun 03 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
mysql函数全面总结
Nov 11 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
Mysql开启外网访问
May 15 MySQL
Mysql中mvcc各场景理解应用
Aug 05 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 #MySQL
Mysql数据库group by原理详解
delete in子查询不走索引问题分析
Jul 07 #MySQL
MySQL提升大量数据查询效率的优化神器
mysql查看表结构的三种方法总结
Jul 07 #MySQL
MySQL中正则表达式(REGEXP)使用详解
MySQL实现字段分割一行转多行的示例代码
You might like
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
js实现五星评价功能
2017/03/08 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
vue小白入门教程
2018/04/02 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
详解python进行mp3格式判断
2016/12/23 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python安装本地whl的实例步骤
2019/10/12 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
C语言面试题
2015/10/30 面试题
家居装修公司创业计划书范文
2014/03/20 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书