MySQL数据库事务剖析

事务就是一组原子性的SQL查询,是一个独立的执行单元。事务内的语句,要么全部执行成功,要么全部执行失败。

1、事务的标准特征

一个运行良好的事务处理系统,必须具备原子性、一致性、隔离性、持久性。

原子性:一个事务必须被视为一个不可分割的最小工作单元,这个事务的所有操作要么全部提交成功,要么全部失败回滚。

一致性:数据库总是从一个一致性的状态转换到另外一个一致性状态。比如在一个事务中执行一组sql,其中一个执行失败,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。

隔离性:通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。

持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。

2、隔离级别

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

未提交读:

在此级别中,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。

提交读:

此级别是大多数数据库系统的默认隔离级别。此级别满足前面提到的隔离性的简单定义:一个事务开始时,只能看见已经提交的事务所做的修改。换言之,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读。比如:A事务第一次读取数据,然后B事务更改该数据并提交,A事务再次读取数据,两次读取的数据不一样。

可重复读:

此级别是MySQL的默认级别。基于提升并发性能的考虑,MySQL的InnoDB存储引擎实现的都不是简单的行级锁,而是多版本并发控制(MVCC),MVCC可以被认为是行级锁的变种,但是它却避免了很多情况下的加锁操作,因此开销更低。MVCC 的实现是通过保存数据在某个时l同点的快照来实现的。InnoDB的MVCC是通过在每行记录后面保存两个隐藏 的列来实现的。这两个列,一个保存了行的创建时间 ,一个保存行的过期时间 (或删除时间)。有赖于MVCC,同一个事务中的查询只能返回版本号不高于当前事务版本的数据,即事务只能看到该事务开始前或者被该事物影响的数据。即防止了不可重复读的发生。

依靠上面的机制,已经做到了在事务内数据内容的不变,但是不能保证多次查询得到的数据数量一致。因为在一个事务执行的过程中别的事务完全可以执行数据插入,当插入了刚好符合查询条件的数据时,就会引发数据查询结果集增加,引发幻读。InnoDB提供的间隙锁机制可以在一定程度上防止幻读的发生。

可串行化:

此级别是最高的隔离级别,它通过强制事务串行执行,避免了前面所说的幻读的问题。简单地说,可串行化会在读取地每一行数据上加锁,所以可能导致大量的超时和锁争用的问题。实际应用中很少用到此级别。

3、死锁

  死锁是两个或者多个事务在同一个资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循坏的过程。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。如下所示:

事务A:

事务B:

如果两个事务都执行了第一条update语句,更新了一行数据,同时锁定了该行数据,然后这两个事务又尝试去执行第二个update语句,但是发现该行数据已经被对方锁定,然后都等待对方释放锁,同时持有对方需要的锁,则陷入死循环。死锁发生以后只有部分或完全回滚一个事务才能打破死锁。

为解决死锁,数据库往往会实现各种死锁检测和死锁超时机制。

4、事务日志

事务日志可以提高事务的效率。使用事务日志,存储引擎在修改表的数据时,只需要修改其内存拷贝,再把该修改行为持久化到磁盘上的事务日志中,而不需要每次都将数据持久到磁盘。事务日志采用追加的方式,写日志的操作是磁盘上一小块区域内的顺序IO,而不像随机IO需要在磁盘的多个地方移动磁头。事务日志持久化以后,内存中被修改的数据被慢慢刷回磁盘。这种方式称为预写式日志,Innodb通过此方式来保证事务的完整性。

如果数据的修改被持久化到事务日志,而数据本身还没有被写回磁盘,此时系统崩溃,则存储引擎存重启以后会自动恢复这部分被修改的数据。

Innodb事务日志包括:重做日志redo和回滚日志undo。

Redo记录的是已经全部完成的事务,就是执行了commit的事务,记录文件是ib_logfile0 ib_logfile1。Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录下表空间中的。

一般情况下,mysql在崩溃之后,重启服务,innodb通过回滚日志undo将所有已完成并写入磁盘的未完成事务进行rollback,然后redo中的事务全部重新执行一遍即可恢复数据。

5、MySQL事务处理的方法

(1)、用begin,rollback,commit来实现

begin 开始一个事务

rollback 事务回滚

commit  事务确认

如下图所示:

(2)、默认采用自动提交模式

如果不是显式的开启一个事务,则每个查询都当作一个事务执行提交操作。在当前连接中可以通过设置variables来启用或者禁用自动提交模式。

查看当前系统的自动提交是否开启: show variables like "autocommit%"; 

如上图所示:1或者ON表示启用,0或者OFF表示禁用。

我们可以通过

set autocommit=0   禁止自动提交

set autocommit=1 开启自动提交

来实现事务的处理。

如下图所示:

时间: 2025-01-01 11:26:43

MySQL数据库事务剖析的相关文章

mysql数据库事务详细剖析

在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数据库事务.其实好多内容适用于各种标准数据库! 直接就进入正文了! 不管是做啥都有理论知识,我在这块也介绍一下. 事务的特性 1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 2.一致性(Consistency):在一个事务中,事务前后数

MySQL数据库事务隔离级别(Transaction Isolation Level)

今天在学习JDBC的时候看到了关于MySql的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = R

MySQL 数据库事务与复制

好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式来剖解技术,很多时候我们都不是在创造新技术,而是在应用技术. 为了更有效率与效果的用好技术,我们需要了解一些技术的原理与工作方式. 带着问题从使用者的角度去剖析技术原理,并将开源技术产品和框架作为一类技术的参考实现来讲解. 以讲清原理为主要目的,对于具体实现的技术细节若无特别之处则尽可能点到即止.

MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)

本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解. 2.数据库事务的隔离级别只是了解,并没有深刻理解,也没有在实际工作中体验使用过. 3.经常面试被人问起数据库加锁情况,一头雾水,很懵. 4.在网上找过很多博客,有的写得太多没耐心看,有的写得摘抄的定义,泛泛而谈,没有实操更没有讲解. 1.2 关于这篇分享对以上问题的解决 1.实践出真知,如果认真

MySQL数据库事务各隔离级别加锁情况--read committed &amp;&amp; MVCC(转)

本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理解.这篇记录我对 MySQL 事务隔离级别 read committed & MVCC 的理解. 前言 可以很负责人的跟大家说,MySQL 中的此隔离级别不单单是通过加锁实现的,实际上还有repeatable read 隔离级别,其实这两个隔离级别效果的实现还需要一个辅助,这个辅助就是MVCC-多版

[MySQL] 生产环境MySQL数据库事务一直在RUNNING

前言: 运营人员反映,有一单子提交卡住了,页面一直没有返回. 1,刚开始怀疑是应用服务器或者db压力过高hang住了,马上去check应用服务器以及db的负载,看起来都OK,蛮低的,应该不是DB性能问题. 2,最后去看下是否是表锁住了,查看到有2个事务一直RUNNING,没有结束., mysql> select * from INNODB_TRX\G;*************************** 1. row ***************************           

MYSQL数据库事务介绍

一.数据库事务介绍 简单地说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句, 执行时要么全成功要么全失败. 列如:小明给小红转账5块钱,流程如下: 1.从小明银行卡取出5元,计算式money-5 2.把上面5块钱打入小红的账号上,小红收到5块,money+5 上述转账的过程,对应的sql语句为: update  xiaoming_account set money=money-5 where name='xiaoming'; update  xiaohong_account

MYSQL数据库事务4种隔离级别及7种传播行为

事务的特性: 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割. 一致性:事务执行的前后,数据完整性保持一致. 隔离性:事务执行不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库中. 查看/设置隔离级别 查看:SELECT @@tx_isolation  设置:set tx_isolation='xxx' 事务的隔离级别 如果不考虑隔离性,引发一些安全问题 隔离性:一个事务的执行,不应该受到其他事务的干扰. 脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致

Mysql数据库事务详解

80年代中国人结婚四大件:手表.自行车.缝纫机.收音机(三转一响).要把事务娶回家需要四大件,所以事务很刻薄(ACID),四大件清单:原子性(Atom).一致性(Consistent).隔离性(Isolate).持久性(Durable).ACID就是数据库事务正确执行的四个基本要素的缩写. 原子性:要么不谈,要谈就要结婚! 对于其数据修改,要么全都执行,要么全都不执行.如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标.最典型的问题就是银行转帐问题. 一致性:恋爱时,什么方式爱我:结婚