1. 事务概念

事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的 MySQL 操作要么完全执行,要么完全不执行。

下面是关于事务处理需要知道的几个术语:

  • 事务(transaction )指一组 SQL 语句;
  • 回退(rollback)指撤销指定 SQL 语句的过程;
  • 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
  • 保留点(savepoint )指事务处理中设置的临时占位符(placeholder),

你可以对它发布回退(与回退整个事务处理不同)。


事务仅仅适应于 INSERTUPDATEDELETE,对 SELECTCREATEDROP不生效。

2. 事务控制语句

SQL 定义了用于管理数据库事务的事务控制语句(Transaction Control Language)。MySQL 实现了以下语句:

  • BEGIN 或者 START TRANSACTION,开始一个事务;
  • COMMIT,提交事务;
  • ROLLBACK,撤销事务;
  • SAVEPOINT,事务保存点,用于撤销部分事务;
  • SET autocommit = {0 | 1},设置事务是否自动提交。

实际上,由于 MySQL 默认启用了自动提交(autocommit),任何数据操作都会自动提交:

show variables like 'autocommit';
Variable_name|Value|
-------------|-----|
autocommit   |ON   |INSERT INTO bank_card VALUES ('62220803', 'C', 2000);

接下来我们看一下 ROLLBACK 命令的作用:

BEGIN;
INSERT INTO bank_card VALUES ('62220804', 'D', 1000);
ROLLBACK;

其中,BEGIN 开始一个新的事务;然后插入一条记录;最后使用 ROLLBACK 撤销该事务。因此,最终不会创建卡号为 “62220804” 的记录。

Oracle 支持事务管理的 COMMITROLLBACK 以及 SAVEPOINT 语句。Oracle 中不需要手动开始事务,一个事务的结束意味着另一个事务的开始。
SQL Server 支持事务管理的 BEGIN TRANSACTIONCOMMITROLLBACK 以及 SAVE TRANSACTION 语句。
PostgreSQL 支持事务管理的 BEGINCOMMITROLLBACK 以及 SAVEPOINT语句。

3. 事务的 ACID 属性

SQL 标准定义了数据库事务的四种特性:ACID

3.1 原子性

原子性(Atomic)是指一个事务包含的所有 SQL 语句要么全部成功,要么全部失败。

例如,某个事务需要更新 100 条记录;但是在更新到一半时系统出现故障,数据库必须保证能够回滚已经修改过的数据,就像没有执行过任何修改一样。

3.2 一致性

一致性(Consistency)意味着事务开始之前,数据库位于一致性的状态;事务完成之后,数据库仍然位于一致性的状态。

例如,银行转账事务中;如果一个账户扣款成功,但是另一个账户加钱失败,就会出现数据不一致(此时需要回滚已经执行的扣款操作)。另外,数据库还必须保证满足完整性约束,比如账户扣款之后不能出现余额为负数(在余额字段上添加检查约束)。

3.3 隔离性

隔离性(Isolation)与并发事务有关,一个事务的影响在提交之前对其他事务不可见,多个并发的事务之间相互隔离。

例如,账户 A 向账户 B 转账的过程中,账户 B 查询的余额应该是转账之前的数目;如果多人同时向账户 B 转账,结果也应该保持一致性,和依次进行转账的结果一样。SQL 标准定义了 4 种不同的事务隔离级别,我们将会在下文进行介绍。

3.3 持久性

持久性(Durability)表示已经提交的事务必须永久生效,即使发生断电、系统崩溃等故障,数据库都不会丢失数据。

数据库系统通常使用重做日志(REDO)或者预写式日志(WAL)实现事务的持久性。简单来说,它们都是在提交之前将数据的修改操作记录到日志文件中;当数据库出现崩溃时,可以利用这些日志重做之前的修改,从而避免数据的丢失。

对于我们开发者而言,重点需要注意的是隔离级别,而隔离级别又与并发访问有关。

4. 并发和隔离级别

数据库的并发意味着多个用户同时访问相同的数据,例如 A 和 C 同时给 B 转账。数据库的并发访问可能带来以下问题:

4.1 脏读(Dirty Read

当一个事务允许读取另一个事务修改但未提交的数据时,就可能发生脏读。

例如,B 的初始余额为 0;A 向 B 转账 1000 元但没有提交;此时 B 能够看到 A 转过来的 1000 元,并且成功取款 1000 元;然后 A 取消了转账;银行损失了 1000 元。很显然,银行不会允许这种事情发生。

4.2 不可重复读(Nonrepeatable Read

一个事务读取某一记录后,该数据被另一个事务修改提交,再次读取该记录时结果发生了改变。

例如,B 查询初始余额为 0;此时 A 向 B 转账 1000 元并且提交;B 再次查询发现余额变成了 1000 元,以为天上掉馅饼了。

4.3 幻读(Phantom Read

一个事务第一次读取数据后,另一个事务增加或者删除了某些数据,再次读取时结果的数量发生了变化。幻读和非重复读有点类似,都是由于其他事务修改数据导致的结果变化。

4.4 更新丢失(Lost Update

第一类:当两个事务更新相同的数据时,如果第一个事务被提交,然后第二个事务被撤销;那么第一个事务的更新也会被撤销。第二类:当两个事务同时读取某一记录,然后分别进行修改提交;就会造成先提交的事务的修改丢失。

5. 隔离级别

为了解决并发访问可能导致的各种问题,SQL 标准定义了 4 种不同的事务隔离级别(从低到高):

隔离级别 脏读 更新丢失 不可重复读 幻读
读未提交(Read Uncommitted) 可能 可能 可能 可能
读已提交(Read Committed) 可能 可能 可能
可重复读(Repeatable Read) 可能
序列化(Serializable)
  • 读未提交隔离级别最低,一个事务可以看到其他事务未提交的修改。该级别可能产生各种并发异常;如果一个事务已经修改某个数据,则另一个事务不允许同时修改该数据,写操作一定是按照顺序执行。PostgreSQL 消除了读未提交级别时的脏读。
  • 读已提交只能看到其他事务已经提交的数据,不会出现脏读。
  • 可重复读可能出现幻读。MySQL 中的 Innodb 存储引擎和 PostgreSQL 在可重复读级别消除了幻读。
  • 序列化提供最高级别的事务隔离。它要求事务只能一个接着一个地执行,不支持并发访问。

事务的隔离级别越高,越能保证数据的一致性;但同时会对并发带来更大的影响。不同数据库默认使用的隔离级别如下:

  • OracleSQL Server 以及 PostgreSQL 默认使用读已提交隔离级别;
  • MySQL InnoDB 存储引擎默认使用可重复读隔离级别。

一般情况下,大多数数据库的默认隔离级别为读已提交;此时,可以避免脏读,同时拥有不错的并发性能。尽管可能会导致不可重复度、幻读以及丢失更新,但是可以通过应用程序加锁进行处理。

MySQL 学习笔记(9)— 事务控制语句、事务属性以及并发和隔离级别相关推荐

  1. Java事务的ACID属性和四种隔离级别和传播机制

    事务的ACID属性 数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity).一致性(Consistency).隔离性(Isolation ...

  2. 小白终是踏上了这条不归路----小文的mysql学习笔记目录

    ** 小文的学习笔记正在每日连载当中 为了方便观察,小文在练习的时候用的是图形化工具SQLyog然后用共用到两张表,employees表和girls表. 如果有需要该软件和上述两张表的兄弟可以 关注 ...

  3. MySQL学习笔记07【事务、用户管理和权限管理】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  4. JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  5. 献给入门小白的MySQL学习笔记+案例

    MySQL学习笔记 目录 MySQL学习笔记 1.SQL概述 1.1:数据库的好处 1.2:数据库管理系统 1.3:SQL语言概述 1.4:SQL语言的分类 2.安装与使用 2.1:MySql数据库产 ...

  6. 实用篇 | MySQL 学习笔记

    实用篇 | MySQL 学习笔记 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management S ...

  7. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. MySQL学习笔记-基础篇1

    MySQL 学习笔记–基础篇1 目录 MySQL 学习笔记--基础篇1 1. 数据库概述与MySQL安装 1.1 数据库概述 1.1.1 为什么要使用数据库 1.2 数据库与数据库管理系统 1.2.1 ...

  9. MySQL学习笔记(1)——高可用组复制

    MySQL学习笔记(1)--高可用组复制 积土成山,风雨兴焉.积水成渊,蛟龙生焉. 一.概念 组复制(MySQL Group Replication,MGR)是MySQL官方在MySQL 5.7.17 ...

最新文章

  1. 学习Linux命令神器-看不懂直接给你解释
  2. Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>> *‘ with an rvalue of type ‘NSArr
  3. MPLS 成为连接到云的绝佳方法的4个原因
  4. 使用DLL封装窗体和业务类
  5. 在页面里点击一个按钮后出来一个层,可以操作的那么一个层!
  6. ServletContext作用功能详解
  7. 苹果用户每天解锁iPhone手机80次
  8. atitit.二维码生成总结java zxing
  9. Kafka常见面试题
  10. Java面试面经大合集(含答案),大厂越来越简单进了,建议收藏
  11. jQuery Mobile 【弹窗】
  12. 遗传算法的应用之函数优化和组合优化
  13. 枯燥的Kotlin协程三部曲(中)——应用实战篇
  14. 《黑马程序员》 category分类的使用(Objective - c语法)
  15. 字符流的相关概念和相关方法的使用、IO异常的处理以及Properties属性集
  16. 天猫登录html代码,天猫静态页面
  17. iOS 12.4 越狱工具 unc0ver 详细教程;Android 手机无痛互传;Apple 更改应用评级
  18. linux用cat命令创建一个文件,用cat在命令行创建文件
  19. Kotlin写界面时诸多控件的点击事件
  20. Nginx + Lua + API:实现精准城市级别的访问控制

热门文章

  1. 你听说过反摩尔定律吗?
  2. php会话的销毁和退出,销毁PHP会话
  3. Go 知识点(04)— 结构体字段转 json格式 tag 标签的作用
  4. 最好用的修改docker镜像源的方式
  5. python 浮点数未解之谜
  6. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
  7. Python | 安装Jupyter Notebook及其目录的更改 jupyter问题
  8. SpringSecurity安全验证中文乱码问题
  9. LeetCode简单题之打折购买糖果的最小开销
  10. 云端一体全栈解决方案