原文链接:https://blog.ouyangsihai.cn/ >> MySQL事务,这篇文章就够了
在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的系列文章,应该对你读下面的文章有所帮助。
- InnoDB与MyISAM等存储引擎对比
- 面试官问你B树和B+树,就把这篇文章丢给他
- MySQL的B+树索引的概念、使用、优化及使用场景
- MySQL全文索引最强教程
- MySQL的又一神器-锁,MySQL面试必备
0 什么是事务
事务(Transaction) 是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都 执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每 个事务结束时,都能保持数据一致性。
同时,事务有着严格的地定义,必须满足四个特性,也就是我们一直说的ACID,但是,并不是说各种数据库就一定会满足四个特性,对于不同的数据库的实现来说,在不同程度上是不一定完全满足要求的,比如,Oracle数据库来说,默认的事务隔离级别是READ COMMITTED
,是不满足隔离性的要求的。
下面我们趁热打铁,介绍一下事务的必知必会的四大特性,这几个特性也是在面试中,面试官面试MySQL的相关知识的时候,问的比较多的问题,所以,这几个特性务必需要理解并且透彻的记在心里,开个玩笑,被火车撞了,也不应该忘记这四个特性!
1 事务的四大特性
事务的四大特性简称为:ACID
,分别是原子性、一致性、隔离性和持久性。
下面我们一一来介绍一下。
- 原子性(Atomicity)
原子性指的是整个数据库的事务是一个不可分割的工作单位,每一个都应该是一个原子操作。
当我们执行一个事务的时候,如果一系列的操作中,有一个操作失败了,那么,需要将这一个事务中的所有操作恢复到执行事务之前的状态,这就是事务的原子性。
下面举个简单的例子。
i++;
上面这个最简单不过的代码经常也会被问到,这是一个原子操作吗?那肯定不是,如果我们把这个代码放到一个事务中来说,当i+1
出现问题的时候,回滚的就是整个代码i++(i = i + 1)了,所以回滚之后,i的值也是不会改变的。
以上就是原子性的概念。
- 一致性(consistency)
一致性是指事务将数据库从一种状态转变为下一种一致性的状态,也就是说在事务执行前后,这两种状态应该是一样的,也就是数据库的完整性约束不会被破坏。
另外,需要注意的是一致性是不关注中间状态的,比如银行转账的过程,你转账给别人,至于中间的状态,你少了500 ,他多了500,这些中间状态不关注,如果分多次转账中间状态也是不可见的,只有最后的成功或者失败的状态是可见的。
如果到分布式的一致性问题,又可以分为强一致性、弱一致性和最终一致性,关于这些概念,可以自己查查,还是很有意思的。
- 隔离性(isolation)
事务我们是可以开启很多的,MySQL数据库中可以同时启动很多的事务,但是,事务和事务之间他们是相互分离的,也就是互不影响的,这就是事务的隔离性。
- 持久性(durability)
事务的持久性是指事务一旦提交,就是永久的了,就是发生问题,数据库也是可以恢复的。因此,持久性保证事务的高可靠性。
2 事务的分类
事务可以分为很多中类型,一般分为:扁平事务、带有保存点的扁平事务、链事务、嵌套事务、分布式事务。
扁平事务
扁平事务是最简单的一种,在实际开发中也是使用的最多的一种事务。在这种事务中,所有操作都处于同一层次,最常见的方式如下:
BEGIN WORK
Operation 1
Operation 2
Operation 3
...
Operation N
COMMIT WORK
举个例子
begin work;
select * from user;
update user set name = 'sihai' where id = 1;
commit work;
扁平事务的主要缺点是不能提交或回滚事务的某一部分,或者分几个独立的步骤去提交。
带有保存点的扁平事务
这种事务除了支持扁平事务支持的操作外,这种事务跟扁平事务最大的区别就是允许在事务执行过程中回滚到同一事务中较早的一个状态,这是因为可能某些事务在执行过程中出现的错误并不会对所有的操作都无效,放弃整个事务不合乎要求,开销也太大。保存点用来通知系统应该记住事务当前的状态,以便以后发生错误时,事务能回到该状态。
举个例子
begin work;
select * from user;
savepoint t1;
update user set name = 'sihai' where id = 1;
savepoint t2;
commit work;
通过上面的方式我们就建立了两个保存点t1、t2,通过ROLLBACK TO SAVEPOINT t1
,我们就可以返回到保存点t1
。
链事务
链事务:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务。需要注意,提交事务操作和下一个事务操作将合并为一个原子操作,就是下一个事务可以看到上一个事务的结果。
链事务,就是指回滚时,只能恢复到最近一个保存点;而带有保存点的扁平事务则可以回滚到任意正确的保存点。
举个例子
begin work;
select * from user;
savepoint t1;
update user set name = 'sihai' where id = 1;
savepoint t2;
commit work;
还是这个例子,但是对于链事务来说,是不能直接rollback到保存点t1的,最能恢复到最近的一个保存点t2;另外我们需要注意,链事务在执行commit后就会释放当前事务所持有的所有锁,而带有保存点的扁平事务不会影响所持有的锁。
嵌套事务
在事务中再嵌套事务,这种结构有点像一颗横着的树的结构,位于根节点的事务称为顶层事务。事务的前驱称为父事务,其它事务称为子事务。事务的前驱称为父事务,事务的下一层称为子事务。
子事务既可以提交也可以回滚,但是它的提交操作并不马上生效,除非由其父事务提交。因此就可以确定,任何子事务都在顶层事务提交后才真正的被提交了。同理,任意一个事务的回滚都会引起它的所有子事务一同回滚。
BEGIN WORK
SubTransaction1:
BEGIN WORK
SubOperationX
COMMIT WORK
SubTransaction2:
BEGIN WORK
SubOperationY
COMMIT WORK
...
SubTransactionN:
BEGIN WORK
SubOperationN
COMMIT WORK
COMMIT WORK
分布式事务
分布式事务通常是指在一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。
在不同的物理地址,通过网络访问,执行不同的事务,这就是分布式事务。
3 事务的使用
首先这一部分我们还是先介绍一下这些事务的语句,也不是很多,使用也不复杂,下面用一个表格做一个整理。
注意:
COMMIT
和COMMIT WORK
语句不同之处在于COMMIT WORK用来控制事务结束后的行为是CHAIN
还是RELEASE
,如果是CHAIN,那么事务就是链事务。
用户可以通过参数completion_type
控制,如下:
- completion_type = 1 实例
执行下面的操作;
SET @@completion_type = 1;
BEGIN WORK;
INSERT INTO lock_test SELECT 10;
COMMIT WORK;
接着我们再执行下面的操作;
INSERT INTO lock_test SELECT 115;
ROLLBACK;
SELECT * FROM lock_test;
我们先插入一条数据115,然后再回滚,我们知道如果不是在一个事务的时候,115应该是会插入成功的,就算我们回滚了,但是,这里我们回滚之后,查询结果如下:
这个时候并没有115这条记录,也就是回滚生效了,说明在COMMIT WORK
之后,又是一个新的事务,所以才会出现这样的结果。
- completion_type = 2 实例
我们先进行下面的操作;
SET @@completion_type = 2;
BEGIN WORK;
INSERT INTO lock_test SELECT 5;
COMMIT WORK;
上面我们已经提交事务了,当我们使用下面的语句查询lock_test的数据的时候,就会出现断开连接。
SELECT * FROM lock_test;
4 事务的隔离级别
事务的隔离级别有四种分别是:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
对于这几种隔离级别会带来的问题及总结,可以查看这篇文章:MySQL的又一神器-锁,MySQL面试必备
5 总结
这篇文章从下面几个内容介绍了一下MySQL数据库事务的内容,更详细的其他内容在后面的文章中再讲解。
- 概念
- 事务类型
- 事务使用
- 事务的隔离级别
文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:
好好学java
,获取优质学习资源。
相关推荐
MySQL有这一篇就够
关于mysql的事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System....
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
MYSQL教程 MYSQL教程MYSQL教程 MYSQL教程尚硅谷MySQL全套教程包含MySql核心技术篇和MySQL高级篇。数据库视频教程,全套视频教程。
### MySQL 事务的基本使用——基本原理及特点 ACID #### 一、事务的概念与作用 在数据库管理系统中,事务(Transaction...通过本篇文章的学习,相信读者已经对MySQL事务的基本原理、特点以及使用方法有了全面的认识。
简单说明了MySQL的事务。 事务的由来,事务在MySQL中的用法。
在这个"mysql事务学习资料(PPT+源码)"中,你将深入理解MySQL事务的概念、类型、特性和实际应用。 1. **事务概念**:在数据库中,事务是一系列操作的集合,这些操作要么全部成功,要么全部回滚,以保持数据的一致性...
除了通过标准的XA接口实现分布式事务外,MySQL还提供了内部的XA支持,这意味着开发者可以直接在MySQL服务器内部使用XA功能,而无需依赖外部的事务管理器。 #### 九、总结 本文详细介绍了MySQL如何通过XA协议实现...
### MySQL事务处理用法与实例详解 #### 一、事务的概念及重要性 在数据库管理中,事务(Transaction)是指一系列作为一个整体的操作序列。这些操作要么全部成功,要么全部失败,不能只执行其中的一部分。事务处理...
MySQL事务是数据库操作的核心部分,它确保了数据库的稳定性和数据的一致性。在MySQL中,事务主要用于保证多条SQL语句作为一个整体执行,如果其中任何一条语句执行失败,整个事务都会被回滚,以维护数据的完整性和...
三、MySQL事务隔离级别 MySQL通过设置不同的事务隔离级别来解决并发问题。隔离级别越高,并发性能越低,但数据一致性越好。 1. 读未提交(read-uncommitted):允许事务读取未提交的数据,不能防止脏读,是最宽松的...
MySQL 事件、触发器、事务实验报告 MySQL 事件调度器是 MySQL 中的一种机制,可以根据指定的时间间隔执行特定的 SQL 语句。事件调度器有两个优点:一是可以用于定期统计、清理、检查等操作;二是可以提高数据库的...
mysql 事务等待锁超时分析
在本文中,我们将深入探讨MySQL的事务处理、预编译查询的概念,以及Perl DBI模块如何简化这些操作。 首先,让我们了解一下MySQL中的事务。事务是数据库操作的基本单位,它确保一组操作要么全部成功,要么全部失败,...
### MySQL或Oracle通过ODBC与C#建立连接和进行事务处理 #### 一、概述 在现代企业级应用开发中,数据库的选择对于整个系统的稳定性和性能有着至关重要的影响。随着多语言开发的需求日益增长,如何让不同的编程语言...
nodejs + mysql 事物处理问题 呵呵 看了就知道 记得npm install啊 需要的东西啊 本想免费 苦于没积分 ,需要的的同学,给点分吧
例如,当我们将A表中的100条数据导入B表,然后删除A表中的对应数据,如果这个过程在一个事务中进行,即使中间出现意外,如系统崩溃,MySQL能够通过回滚事务来恢复到操作开始前的状态,避免数据的不一致。 非事务表...
MySQL 事务管理是数据库操作的重要组成部分,特别是在处理关键数据和多步骤操作时,确保数据的一致性和完整性至关重要。事务提供了原子性、一致性、隔离性和持久性的保障,这四个特性通常被简称为ACID属性。 原子性...
在PHP中使用MySQL事务,通常涉及到几个关键函数:`mysql_query()`、`mysql_rollback()` 和 `mysql_commit()`。下面通过示例代码来详细说明: ```php // 开启事务 mysql_query("SET AUTOCOMMIT=0"); mysql_query(...