zoukankan      html  css  js  c++  java
  • MySQL事务概述-1

    事务是数据库区别于文件系统最重要的特性之一。事务可由一条非常简单的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>

    对事物的操作统计

    【待续】

  • 相关阅读:
    UVA1627-Team them up!(二分图判断+动态规划)
    UVA10817-Headmaster's Headache(动态规划基础)
    UVA1626-Brackets sequence(动态规划基础)
    UVA11584-Partitioning by Palindromes(动态规划基础)
    UVA11584-Partitioning by Palindromes(动态规划基础)
    UVA11400-Lighting System Design(动态规划基础)
    UVA12563-Jin Ge Jin Qu hao(动态规划基础)
    UVA116-Unidirectional TSP(动态规划基础)
    JavaScriptCore框架在iOS7中的对象交互和管理
    iOS7新JavaScriptCore框架入门介绍
  • 原文地址:https://www.cnblogs.com/wxzhe/p/10010507.html
Copyright © 2011-2022 走看看