0

0

MySQL事务的ACID特性及并发问题知识点总结

WBOY

WBOY

发布时间:2022-07-25 17:39:18

|

2724人浏览过

|

来源于脚本之家

转载

本篇文章给大家带来了关于mysql的相关知识,主要介绍了mysql事务的acid特性以及并发问题方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下,希望对大家有帮助。

MySQL事务的ACID特性及并发问题知识点总结

推荐学习:mysql视频教程

一、事务的概念

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

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

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

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

事务处理有三个状态:

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

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

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

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

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

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

磁力开创
磁力开创

快手推出的一站式AI视频生产平台

下载

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

二、ACID特性

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

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

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是否自动提交事务

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

推荐学习:mysql视频教程

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

321

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

677

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

417

2024.04.29

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 801人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号