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 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
MySQL常用慢查询分析工具详解
Aug 14 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
Mysql如何查看是否使用到索引
Dec 24 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 #MySQL
Mysql数据库group by原理详解
delete in子查询不走索引问题分析
Jul 07 #MySQL
MySQL提升大量数据查询效率的优化神器
mysql查看表结构的三种方法总结
Jul 07 #MySQL
MySQL中正则表达式(REGEXP)使用详解
MySQL实现字段分割一行转多行的示例代码
You might like
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
财务会计实习报告体会
2013/12/20 职场文书
大学生职业生涯规划书模版
2013/12/30 职场文书
早餐连锁店计划书
2014/01/08 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
委托书范文
2014/04/02 职场文书
初中信息技术教学计划
2015/01/22 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
Elasticsearch 基本查询和组合查询
2022/04/19 Python
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技