• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 简单介绍MySQL中的事务机制

简单介绍MySQL中的事务机制

作者:杨国栋 字体:[增加 减小] 来源:互联网 时间:2017-05-11

杨国栋通过本文主要向大家介绍了mysql锁机制,mysql的运行机制,mysql数据库锁机制,mysql安全机制,mysql缓存机制等相关知识,希望本文的分享对您有所帮助

从一个问题开始

最近银行这个事情闹的比较厉害啊,很多储户的钱放在银行,就不翼而飞了,而银行还不管不问,说是用户的责任,打官司,用户还能输了,这就是“社会主义”。咱还是少发牢骚,多种树,莫谈国事。

说到银行存钱,就不得不说一下从银行取钱这件事情,从ATM机取钱这件简单的事情,实际上主要分为以下几个步骤:

  1.     登陆ATM机,输入密码;
  2.     连接数据库,验证密码;
  3.     验证成功,获得用户信息,比如存款余额等;
  4.     用户输入需要取款的金额,按下确认键;
  5.     从后台数据库中减掉用户账户上的对应金额;
  6.     ATM吐出钱;
  7.     用户把钱拿走。

一个简单的取钱,主要分为以上几步。不知道大家有没有“天真”的想过,如果在第5步中,后台数据库中已经把钱减掉了,但是ATM还就是没有吐出钱(虽然实际也发生过,但是毕竟是低概率事件),这该怎么办?

关于这个问题,银行系统的开发人员早就想过了,那么他们是怎么来搞定这个问题的呢?这就要说到今天总结的事务这个概念了。
简单说说事务

对于上面的取钱这个事情,如果有一步出现了错误,那么就取消整个取钱的动作;简单来说,就是取钱这7步,要么都完成,要么就啥也不做。在数据库中,事务也是这个道理。

事务由一条或者多条sql语句组成,在事务中的操作,这些sql语句要么都执行,要么都不执行,这就是事务的目的。

对于事务而言,它需要满足ACID特性,下面就简要的说说事务的ACID特性。

    A,表示原子性;原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。事务中任何一个sql语句执行失败,那么已经执行成功的sql语句也必须撤销,数据库状态应该退回到执行事务前的状态;
    C,表示一致性;也就是说一致性指事务将数据库从一种状态转变为另一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏;
    I,表示隔离性;隔离性也叫做并发控制、可串行化或者锁。事务的隔离性要求每个读写事务的对象与其它事务的操作对象能相互分离,即该事务提交前对其它事务都不可见,这通常使用锁来实现;
    D,持久性,表示事务一旦提交了,其结果就是永久性的,也就是数据就已经写入到数据库了,如果发生了宕机等事故,数据库也能将数据恢复。

总结了一些事务的基本概念,在MySQL中,事务还是分为很多中的,下面就来看看到底有哪些事务。
有哪些事务

你能想象到吗?就这么个破事务还会分以下这么多种:

  1.     扁平事务;
  2.     带有保存点的扁平事务;
  3.     链事务;
  4.     嵌套事务;
  5.     分布式事务。

现在就来对这些事务从概念的层面上进行简单的总结一下。

    扁平事务
    扁平事务是最简单的一种,也是实际开发中使用的最多的一种事务。在这种事务中,所有操作都处于同一层次,最常见的方式如下:

   BEGIN WORK
     Operation 1
     Operation 2
     Operation 3
     ...
     Operation N
   COMMIT WORK

</div>

    或者是这种:

   BEGIN WORK
     Operation 1
     Operation 2
     Operation 3
     ...
     Operation N
     (Error Occured)
   ROLLBACK WORK

</div>

    扁平事务的主要缺点是不能提交或回滚事务的某一部分,或者分几个独立的步骤去提交。比如有这样的一个例子,我从呼和浩特去深圳,为了便宜,我可能这么干:

   BEGIN WORK
     Operation1:呼和浩特---火车--->北京
     Operation2:北京---飞机--->深圳
   ROLLBACK WORK

</div>

    但是,如果Operation1,从呼和浩特到北京的火车晚点了,错过了航班,怎么办?感觉扁平事务的特性,那我就需要回滚,我再回到呼和浩特,那么这样成本是不是也太高了啊,所以就有了下面的第二种事务——带有保存点的扁平事务。
    带有保存点的扁平事务
    这种事务除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态,这是因为可能某些事务在执行过程中出现的错误并不会对所有的操作都无效,放弃整个事务不合乎要求,开销也太大。保存点用来通知系统应该记住事务当前的状态,以便以后发生错误时,事务能回到该状态。
    链事务
    链事务,就是指回滚时,只能恢复到最近一个保存点;而带有保存点的扁平事务则可以回滚到任意正确的保存点。
    嵌套事务
    看下面这个,你就能明白了,啥是嵌套事务:

   BEGIN WORK
     SubTransaction1:
         BEGIN WORK
           SubOperationX
         COMMIT WORK
     SubTransaction2:
         BEGIN WORK
           SubOperationY
         COMMIT WORK
     ...
     SubTransactionN:
         BEGIN WORK
           SubOperationN
         COMMIT WORK
   COMMIT WORK

</div>

    这就是嵌套事务,在事务中再嵌套事务,位于根节点的事务称为顶层事务。事务的前驱称为父事务,其它事务称为子事务。事务的前驱称为父事务,事务的下一层称为子事务。

    子事务既可以提交也可以回滚,但是它的提交操作并不马上生效,除非由其父事务提交。因此就可以确定,任何子事务都在顶层事务提交后才真正的被提交了。同理,任意一个事务的回滚都会引起它的所有子事务一同回滚。
    分布式事务
    分布式事务通常是指在一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点,比如:通过建设银行向招商银行转账,建设银行和招商银行肯定用的不是同一个数据库,同时二者的数据库也不在一个网络节点上,那么当用户跨行转账,就是通过分布式事务来保证数据的ACID的。

MySQL中使用事务

理论总结的再好,终归都要通过实践来进行理解。下面就来说说MySQL中是如何使用事务的。

在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此要显示地开启一个事务须使用命令BEGIN或START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

来看看我们可以使用哪些事务控制语句。

  1.     BEGIN或START TRANSACTION;显示地开启一个事务;
  2.     COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
  3.     ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  4.     SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
  5.     RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  6.     ROLLBACK TO identifier;把事务回滚到标记点;
  7.     SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

这些不用你“管”

有的时候有些SQL语句会产生一个隐式的提交操作,即执行完成这些语句后,会有一个隐式的COMMIT操作。有以下SQL语句,不用你去“管”:

  •     DDL语句,ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;
  •     修改MYSQL架构的语句,CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD;
  •     管理语句,ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE等。

以上的这些SQL操作都是隐式的提交操作,不需要手动显式提交。
事务的隔离级别

上面也说到了SET TRANSACTION用来设置事务的隔离级别。那事务的隔离级别是什么东东?

    在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。

InnoDB存储引擎提供事务的隔离级别

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL 编码机制
  • MySQL锁机制和PHP锁机制
  • MySQL锁机制和PHP锁机制
  • 深入理解MySQL中的事务机制
  • 简单介绍MySQL中的事务机制

相关文章

  • 2018-12-05关于存储过程的编写的一些体会
  • 2018-12-05VPS下修改MySQL root用户密码的方法
  • 2017-05-11mysqldump造成Buffer Pool污染的研究
  • 2017-05-11MySQL 导入慢的解决方法
  • 2018-12-05MySql数据库分区和分表方法的详解及分区和分表介绍
  • 2017-05-11浅析一个MYSQL语法(在查询中使用count)的兼容性问题
  • 2018-12-05使如何使项目的并发性更高?利用ID自增保证排队顺序
  • 2018-12-05关于mysql_field_name()函数的用法的推荐
  • 2018-12-05mysql初次不能登录解决方法
  • 2017-05-11在MySQL中操作克隆表的教程

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 一步一步教你网站同步镜像(转载)
    • Oracle 9i轻松取得建表和索引的DDL语句
    • utf 8-mysql,jsp,hibernate,不支持utf-8
    • MySQL 字符串函数大全
    • 数据库jdbc封装
    • sqlite如何迁移到MySQL脚本的实例介绍
    • MySQL数据库锁定机制的介绍
    • sqlserver 触发器学习(实现自动编号)
    • Oracle 11g 触发器新增功能
    • oracle 数据库数据迁移解决方案

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有