MySQL事务的ACID特性及并发问题实例分析

MySQL事务的ACID特性及并发问题实例分析

一、事务的概念

一个事务是由一条或多条对数据库操作的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 enginesG查看当前数据库支持哪些存储引擎。

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特性及并发问题实例分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24568

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云
上一篇 2022年9月13日 下午11:32
下一篇 2022年9月13日 下午11:34

相关推荐

  • 2024年9款优质CRM系统全方位解析

    文章介绍的工具有:纷享销客、Zoho CRM、八百客、红圈通、简道云、简信CRM、Salesforce、HubSpot CRM、Apptivo。 在选择合适的CRM系统时,许多企业面临着功能繁多、选择困难的痛点。对于中小企业来说,找到一个既能提高客户关系管理效率,又能适应业务扩展的CRM系统尤为重要…

    2024年7月25日
    1600
  • 数据库权限关系图表是什么

    数据库权限关系图表是一种以图表形式展示数据库权限分配和管理的工具。它可以有效地帮助我们理解和管理数据库中的各种权限关系。数据库权限关系图表主要包含以下几个部分:数据对象、用户(或用户组)、权限类型、权限级别、权限状态等。其中,数据对象是权限关系图表中的核心元素,它代表了数据库中的各种数据资源,如表、…

    2024年7月22日
    200
  • 诚信数据库是什么意思

    诚信数据库是一种收集、存储和管理个人或组织诚信信息的系统。它是一种用于评估和管理个人或组织行为的工具,通常由政府、商业组织或者非营利组织进行运营。诚信数据库的主要功能包括:1、评估个人或组织的诚信状况;2、提供决策支持;3、预防和控制风险;4、促进社会信用体系建设。 在这四大功能中,评估个人或组织的…

    2024年7月22日
    400
  • 数据库期末关系代数是什么

    关系代数是一种对关系进行操作的代数系统,是关系模型的数学基础,主要用于从关系数据库中检索数据。其操作包括选择、投影、并集、差集、笛卡尔积、连接、除法等。其中,选择操作是对关系中的元组进行筛选,只保留满足某一条件的元组;投影操作则是从关系中选择出一部分属性构造一个新的关系。 一、选择操作 选择操作是关…

    2024年7月22日
    700
  • mysql建立数据库用什么命令

    在MySQL中,我们使用"CREATE DATABASE"命令来创建数据库。这是一个非常简单且基础的命令,其语法为:CREATE DATABASE 数据库名。在这个命令中,“CREATE DATABASE”是固定的,而“数据库名”则是你要创建的数据库的名称,可以自己设定。例如,如…

    2024年7月22日
    500
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部