MySQL执行事务的语法与流程详解(MySQL执行事务的语法与流程详解)
MySQL执行事务的语法与流程详解
MySQL执行事务的语法与流程详解摘要:MySQL 提供了多种存储引擎来支持事务。
MySQL 提供了多种存储引擎来支持事务。支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 REDO 日志实现,MyISAM 存储引擎不支持事务。
拓展:任何一种数据库,都会拥有各种各样的日志,用来记录数据库的运行情况、日常操作、错误信息等,MySQL 也不例外。例如,当用户 root 登录到 MySQL 服务器,就会在日志文件里记录该用户的登录时间、执行操作等。
为了维护 MySQL 服务器,经常需要在 MySQL 数据库中进行日志操作:
UNDO 日志:复制事务执行前的数据,用于在事务发生异常时回滚数据。 REDO 日志:记录在事务执行中,每条对数据进行更新的操作,当事务提交时,该内容将被刷新到磁盘。
默认设置下,每条 SQL 语句就是一个事务,即执行 SQL 语句后自动提交。为了达到将几个操作做为一个整体的目的,需要使用 BEGIN 或 START TRANSACTION 开启一个事务,或者禁止当前会话的自动提交。
执行事务的语法和流程
SQL 使用下列语句来管理事务。
1) 开始事务
BEGIN;
或
START TRANSACTION;
这个语句显式地标记一个事务的起始点。
2) 提交事务
MySQL 使用下面的语句来提交事务:
COMMIT;
COMMIT 表示提交事务,即提交事务的所有操作,具体地说,就是将事务中所有对数据库的更新都写到磁盘上的物理数据库中,事务正常结束。
提交事务,意味着将事务开始以来所执行的所有数据都修改成为数据库的永久部分,因此也标志着一个事务的结束。一旦执行了该命令,将不能回滚事务。只有在所有修改都准备好提交给数据库时,才执行这一操作。
3) 回滚(撤销)事务
MySQL 使用以下语句回滚事务:
ROLLBACK;
ROLLBACK 表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。这里的操作指对数据库的更新操作。
当事务执行过程中遇到错误时,使用 ROLLBACK 语句使事务回滚到起点或指定的保持点处。同时,系统将清除自事务起点或到某个保存点所做的所有的数据修改,并且释放由事务控制的资源。因此,这条语句也标志着事务的结束。
总结
BEGIN 或 START TRANSACTION 语句后面的 SQL 语句对数据库数据的更新操作都将记录在事务日志中,直至遇到 ROLLBACK 语句或 COMMIT 语句。如果事务中某一操作失败且执行了 ROLLBACK 语句,那么在开启事务语句之后所有更新的数据都能回滚到事务开始前的状态。如果事务中的所有操作都全部正确完成,并且使用了 COMMIT 语句向数据库提交更新数据,则此时的数据又处在新的一致状态。
实例演示
下面通过两个例子来演示一下 MySQL 事务的具体用法。
例
下面模拟在张三的账户减少 500 元后,李四的账户还未增加 500 时,有其他会话访问数据表的场景。由于代码需要在两个窗口中执行,为了方便阅读,这里我们称为 A 窗口和 B 窗口。
在 A 窗口中开启一个事务,并更新 mybank 数据库中 bank 表的数据,SQL 语句和运行结果如下:
在 B 窗口中查询 bank 数据表中的数据,SQL 语句和运行结果如下:
从结果可以看出,虽然 A 窗口中的事务已经更改了 bank 表中的数据,但没有立即更新数据,这时其他会话读取到的仍然是更新前的数据。
在 A 窗口中继续执行事务并提交事务,SQL 语句和运行结果如下:
在 B 窗口中再次查询 bank 数据表的数据,SQL 语句和运行结果如下:
在 A 窗口中执行 COMMIT 提交事务后,对数据所做的更新将一起提交,其他会话读取到的是更新后的数据。从结果可以看出张三和李四的总账户余额和转账前保持一致,这样数据从一个一致性状态更新到另一个一致性状态。
前面提到,当事务在执行中出现问题,也就是不能按正常的流程执行一个完整的事务时,可以使用 ROLLBACK 语句进行回滚,使用数据恢复到初始状态。
在例 1 中,张三的账户余额已经减少到 500 元,如果再转出 1000 元,将会出现余额为负数,因此需要回滚到原始状态。如例 2 所示。
例
将张三的账户余额减少 1000 元,并让事务回滚,SQL 语句和运行结果如下所示:
从结果可以看出,执行事务回滚后,账户数据恢复到初始状态,即该事务执行之前的状态。
拓展
在数据库操作中,为了有效保证并发读取数据的正确性,提出了事务的隔离级别。在例 1 和例 2 的演示中,事务的隔离级别为默认隔离级别。在 MySQL 中,事务的默认隔离级别是 REPEATABLE-READ (可重读)隔离级别,即事务未结束时(未执行 COMMIT 或 ROLLBACK),其它会话只能读取到未提交数据。
注意事项
MySQL 事务是一项非常消耗资源的功能,大家在使用过程中要注意以下几点。
1) 事务尽可能简短
事务的开启到结束会在数据库管理系统中保留大量资源,以保证事务的原子性、一致性、隔离性和持久性。如果在多用户系统中,较大的事务将会占用系统的大量资源,使得系统不堪重负,会影响软件的运行性能,甚至导致系统崩溃。
2) 事务中访问的数据量尽量最少
当并发执行事务处理时,事务操作的数据量越少,事务之间对相同数据的操作就越少。
3) 查询数据时尽量不要使用事务
对数据进行浏览查询操作并不会更新数据库的数据,因此应尽量不使用事务查询数据,避免占用过量的系统资源。
4) 在事务处理过程中尽量不要出现等待用户输入的操作
在处理事务的过程中,如果需要等待用户输入数据,那么事务会长时间地占用资源,有可能造成系统阻塞。
本文分享自华为云社区《MySQL执行事务的语法和流程》,原文作者:运气男孩。
总结
到此这篇关于MySQL执行事务的语法与流程的文章就介绍到这了,更多相关MySQL执行事务内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://segmentfault.com/a/1190000039032584
- mysql能groupby两个字段吗(MySQL group by语句如何优化)
- mysql导出数据的方法
- mysql建立分区表指令(MySQL高级特性——数据表分区的概念及机制详解)
- mysql详细学习笔记(Mysql常用命令 详细整理版)
- centos安装mysql8.0教程(Centos7 安装 Mysql8教程)
- phpmysql怎么搭建(PHP使用PDO、mysqli扩展实现与数据库交互操作详解)
- mysql读写分离怎么做(MySQL读写分离,写完读不到问题如何解决)
- mysql数据库怎么换行(MySQL数据中很多换行符和回车符的解决方法)
- 宝塔数据库不小心删了(宝塔面板MySQL数据库经常自动停止的解决方法)
- 将SQL Server数据迁移到MySQL的方法
- centos系统mysql安装及连接教程(CentOS8安装SQLServer2019的过程)
- mysql重复插入数据教程(Mysql避免重复插入数据的4种方式)
- python怎样读取mysql数据(使用Python将Mysql的查询数据导出到文件的方法)
- mysql创建用户并给用户授权(MySQL 主从复制中创建复制用户的时机探讨)
- mysql怎么看脱机数据(MYSQL电话号码,身份证数据脱敏的实现)
- mysql存储过程limit参数(MySQL存储过程in、out和inout参数示例和总结)
- 下雪会怎样(下雪怎样画)
- 白蓝色穿搭(白蓝色衣服配什么裤子)
- 天空是什么颜色(天空是什么颜色的英语)
- 高马尾扎发(高马尾扎发教程视频)
- 这里输入关键词(请手动输入关键词)
- 小说 顾瑾岚拿出一套飞行棋,别说你连飞行棋都不会哦(顾瑾岚拿出一套飞行棋)
热门推荐
- sqlserver2008手动备份方法(MSSQL 2008 自动备份数据库的设置方法)
- dedecms打开新页面(DedeCMS 批量取消审核文档的实现方法)
- SQL语句中的乘号处理
- css3怎么改成3d(灵活运用CSS3特性绘制简易版围棋效果)
- mysql语句运行顺序(浅谈mysql执行过程以及顺序)
- docker 跨主机的网络通信(docker 基于golang镜像构建 ssh服务的方法)
- mysql慢日志设置多少合适(MySQL慢查询日志的作用和开启)
- python解析身份证号(python验证身份证信息实例代码)
- mysql复合索引会包含哪些索引(MySQL查询冗余索引和未使用过的索引操作)
- 如何利用Email求职
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9