事务是数据库区别于文件系统最重要的特性之一。事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务操作中,要么都做修改,要么都不做,这就是事务的目的。

MySQL的存储引擎中,INNODB支持事务特性,这里主要讲述INNODB的事务特性。

INNODB存储引擎完全符合事务的ACID特性:

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔离性(isolation)
  • 持久性(durability)

原子性: 是指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才能整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句必须撤销,数据库状态应该退回到执行事务之前的状态。事务是最小的工作单元,构成事务的DML语句,要么全部执行成功,要么全部失败,这就是事务的原子性。

一致性: 在事务的执行前后,不能破坏数据库的完整性约束条件。

隔离性:多个事务并行执行,一个事务的修改对其他事务是不可见的,好似是串行执行的。INNODB使用锁来保证事务的隔离性。

持久性:事务一旦提交,所做的修改时持久的,不会因为数据库的宕机,恢复等丢失事务的修改。

事务的分类(摘自Inside君的《MySQL技术内幕-INNODB存储引擎》):

  • 扁平事务(float  transactions)
  • 带有保存点的扁平事务(flat transactions  with savepoint)
  • 链事务(Chained Transactions)
  • 嵌套事务(Nested Transactions)INNODB存储引擎不支持
  • 分布式事务(Distributed Transactions)

扁平事务:是事务类型中最简单的一种,但在实际中,用的最多。在扁平事务中,所有的操作都处于同一层次,其由begin开始,由commit或者rollback结束,其间操作是原子的,要么都执行,要么全部回滚。

#扁平事务的基本形式如下:
BEGINE WORK;
operation1;
operation2;
.....
commit OR rollback;

带有保存点的扁平事务: 在扁平事务中,事务中的SQL语句要么全部执行,要么全部回滚,但是有时operation1操作执行成功,operation2也执行了,这时候我们想回滚到operation1操作执行之后的状态?引入了保存点的概念,只要在operation1执行之后设置保存点,回滚时指定对应的保存点,就可以回滚到指定的保存点的状态:

mysql> select * from tb1;
+---+
| a |
+---+
| 1 |
| 2 |
| 4 |
+---+
3 rows in set (0.00 sec) mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> insert into tb1 select 5;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> savepoint test1; #设置保存点1
Query OK, 0 rows affected (0.00 sec) mysql> insert into tb1 select 7;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> savepoint test2; #设置保存点2
Query OK, 0 rows affected (0.00 sec) mysql> select * from tb1;
+---+
| a |
+---+
| 1 |
| 2 |
| 4 |
| 5 |
| 7 |
+---+
5 rows in set (0.00 sec) mysql> rollback to test1; #回滚到保存点1
Query OK, 0 rows affected (0.00 sec) mysql> select * from tb1;
+---+
| a |
+---+
| 1 |
| 2 |
| 4 |
| 5 |
+---+
4 rows in set (0.00 sec) mysql>

保存点实例

上面的实例中我们最先开始用begin开启了一个事务,然后又回滚到了保存点test1,需要注意的是这个事务并没有结束,若需要结束需要执行commit或者rollback!

链事务:

保存点事务的一种变种。保存点事务在系统崩溃时,所有的保存点都是易失的,即系统恢复时,事务需要从开始出重新执行,而不能从最近的保存点继续执行。

链事务指的是在提交事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。提交事务和开始下一个事务将合并为一个原子操作。即下一个事务将看到上一个事务的结果,就好象在一个事务中进行一样。

链事务与带有保存点的事务不同,带有保存点的事务能回滚到任意正确的保存点。而链事务中的回滚仅限于当前保存点。

链事务实例见下面:

嵌套事务:

  是一个层次结构框架。由一个顶层事务控制各个层次的事务。顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换。

嵌套事务的定义如下:

  1. 嵌套事务是由若干事务组成的一棵树,子树既可以是嵌套事务,也可以是扁平事务。
  2. 处在叶子节点的是扁平事务。但是每个事务从根到叶节点的距离可以是不同的。
  3. 位于根节点的事务称为顶层事务,其他事务称为子事务。事务的前驱称为父事务,事务的下一层事务称为儿子事务。
  4. 子事务既可以提交也可以回滚。但是它的提交操作并不马上生效,除非其父事务已经提交,任何子事务都在顶层事务提交后才能真正的提交。
  5. 树中的任意一个事务的回滚会引起它的所有子事务一同回滚,故子事务仅保留ACI特性,不具有D特性。

MySQL不支持嵌套事务。

分布式事务

  分布式事务是在分布式环境下运行的扁平事务。

事务控制语句

在MySQL的命令行默认设置下,事务都是自动提交的,即执行语句后就会马上执行commit操作。

mysql> show variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec) #默认情况自动提交时开启的,可以设置为关闭。
#事务控制语句如下
  • start transaction | begin 显式开启一个事务。(在存储过程中MySQL会自动将begin识别为begin....and,因此在存储过程中开启事务,需要使用start transaction)
  • commit | commit work    提交事务
  • rollba | rollback work 回滚事务
  • savepoint 创建保存点
  • release savepoint identifier : 删除一个保存点,当保存点不存在时,会报出异常
  • rollback to 【savepoint】 identifier: 回滚到某一个保存点
  • set transaction leve xxxx: 设置事务的隔离级别

commit和commit work语句基本一致,都是用来提交事务。不同之处在于commit  work用来控制事务结束后的行为是chain还是release的。如果是chain,那么就是链事务。

值(completion_type的取值) 描述
NO_CHAIN(或0) COMMIT并且 ROLLBACK 不受影响。这是默认值。
CHAIN (或1) commit和rollback之后,会自动开启一个事务。
RELEASE(或2) commit和rollback之后,会终止当前会话的连接。

链事务实例:

mysql> select * from tb2;
+------+
| a |
+------+
| 10 |
| 20 |
+------+
2 rows in set (0.00 sec) mysql> set @@completion_type=1; #设置为1
Query OK, 0 rows affected (0.00 sec) mysql> begin; #显式开启一个事务
Query OK, 0 rows affected (0.00 sec) mysql> insert into tb2 select 30; #插入数值30
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> commit; #提交事务
Query OK, 0 rows affected (0.00 sec) mysql> insert into tb2 select 40; #插入40
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> rollback; #回滚事务
Query OK, 0 rows affected (0.00 sec) mysql> select * from tb2; #结果看到只回滚了插入40的事务,也就是说上面的commit提交之后,又开启了一个事务。
+------+
| a |
+------+
| 10 |
| 20 |
| 30 |
+------+
3 rows in set (0.00 sec) mysql>

当数值设置为2时:

mysql> set @@completion_type=2;
Query OK, 0 rows affected (0.00 sec) mysql> select * from tb2;
+------+
| a |
+------+
| 10 |
| 20 |
| 30 |
+------+
3 rows in set (0.00 sec) mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> insert into tb2 select 40;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> commit; #事务提交之后
Query OK, 0 rows affected (0.00 sec) mysql> select @@version; #再次查询会有重新连接的提示,说明上次事务提交之后,断开了当前会话的连接
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 86
Current database: mytest +------------+
| @@version |
+------------+
| 5.7.22-log |
+------------+
1 row in set (0.00 sec) mysql>

对事物的操作统计:

【待续】

MySQL事务概述-1的更多相关文章

  1. MySql事务概述

    事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一. 严格上来说,事务必须同时满足4个特性, ...

  2. MySQL(十三)之MySQL事务

    前言 这段时间自己会把之前学的东西都总结一遍,希望对自己以后的工作中有帮助.其实现在每天的状态都是很累的,但是我要坚持! 进入我们今天的正题: 为什么MySQL要 有事务呢?事务到底是用来干什么的?我 ...

  3. mysql事务回滚机制概述

    应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用 ...

  4. MYSQL事务及存储引擎对比

    Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性 ...

  5. Mysql事务与JDBC事务管理

    一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的事务:一条sql语句就是一个事务 ...

  6. 【JAVAWEB学习笔记】19_事务概述、操作、特性和隔离级别

    事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...

  7. 深度剖析 MySQL 事务隔离

    概述 今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别. 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修 ...

  8. Mysql事务学习笔记

    Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...

  9. MySQL事务基本使用

    目录 1 事务概述 1.1 事务的支持情况 1.2 事务的特性 1.3 事务的状态 2 使用事务 2.1 显示事务 2.2 隐藏事务 3 事务隔离等级 3.1 数据并发问题 3.2 事务隔离等级介绍 ...

随机推荐

  1. linux 输入“make"命令不能执行

    我用的是VM 虚拟机的CDLinux,我想手动安装网卡驱动.网卡驱动也已经复制到linux 系统中了.接下来应该输入:makemake install可窗口提示:-bash:make :command ...

  2. thinkphp5 邮件发送(qq邮箱为例)

    一.首先需要你开启smtp 服务,登录qq邮箱,进入设置 -> 账户 注意: 开启后会生成授权码,一定要记下,两个都记下,登录邮件客户端需要.这里配置邮件发送也需要这个授权码 二. 下载phpm ...

  3. Mahout实现基于用户的协同过滤算法

    Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序 ...

  4. 【黑金ZYNQ7000系列原创视频教程】07.自定义IP——定制RTC IP实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36641&extra=page%3D1 爱奇艺地址: http: ...

  5. sprintf函数详解

    转摘声明:选自<CSDN 社区电子杂志——C/C++杂志> 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样 ...

  6. 网站微图标,页标签,favicon.ico

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,也就是我们常说的favicon.ico, 由于这篇文章主要讨论favicon.ico,以 ...

  7. Linux定时检测内存,若使用率超过指标,重启Tomcat并清空内存

    cd /usr/local vim cleanCacheTime.sh 把以下代码粘贴进去 #!/bin/bash echo "start SyncCleanCache.sh..." ...

  8. jq和axios的取消请求

    场景: 分页: 每次点击分页会发送请求,如果上一次请求还未获取到,下一次请求已经开始且先一步获取到,那么数据上会出现问题. 快速点击会发送多次请求,多次点击的时候一般的做法我们会定义一个flag,此时 ...

  9. Oracle AWR之-enq: TX - allocate ITL entry

    今天收到压力测试期间awr报告,测试人员要我看看数据库是否有可以优化的地方,数据库服务器配置信息:CPU:32*8,内存:480g 单实例数据库:oracle 11.2.0.4.具体分析过程如下: 可 ...

  10. 解决Uploadify 3.2上传控件加载导致的GET 404 Not Found问题

    http://www.uploadify.com/forum/#/discussion/7329/uploadify-v3-bug-unecessary-request-when-there-is-n ...