码迷,mamicode.com
首页 > 其他好文 > 详细

事务控制和锁定语句

时间:2021-06-20 18:17:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ack   语句   出现   设计   事务控制   删除   事务性   文件   开始   

技术图片

 

从表种看出,只有InnoDB和BDB引擎是事务安全表,其它引擎是非事务安全表。在创建表时不指定引擎时,默认会是 InnoDB 引擎。

SHOW ENGINES;

技术图片

 

 默认情况下,表锁和行锁是自动获取的,不需要额外的命令。但有的情况下,用户需 UN要明确的进行锁表或者进行事务的控制以便保证整个事务的完整性。这样就需要使用事务控制和锁定语句来完成。

一、LOCK TABLESUNLOCK TABLE

lock tables 命令是为当前线程锁定表。这里有2种类型的锁定:

一种是读锁定,用命令 lock tables tablename read;

另外一种是写锁定,用命令lock tables tablename write.

1. lock table 读锁定

如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从表中读数据,不能进行任何写操作。

技术图片

 

2. lock table 写锁定

 

 

 如果一个线程在一个表上得到一个   WRITE   锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞。

写锁定的命令:lock tables user write.  

二、事务控制

  MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支持本地事务,具体语法如下

    START TRANSACTION|BEGIN [WORK]

    COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

    ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

    SET AUTOCOMMIT={0|1}

    START TRANSACTION 或 BEGIN 语句可以开始一项新的事务。

    COMMIT 和 ROLLBACK 用来提交或者回滚事务

    CHAIN 和 RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的连接。

    SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了 SET AUTOCOMMIT = 0 ,则设置之后的所有事务都需要通过明确地命令进行提交或者回滚。

  • 默认情况下,MySQL是自动提交的,如果需要通过明确的 Commit 和 Rollback 来提交和回滚事务,那么就需要通过明确地事务控制命令来开始事务,这是和 Oracle 的事务管理明显不同的地方。如果应用是从 Oracle 数据库迁移到 MySQL 数据库,则需要确保应用中是否对事务进行了明确地管理。
  • 如果只是对某些语句需要进行事务控制,则使用 START TRANSACTION 语句开始一个事务比较方便,这样事务结束之后可以自动回到自动提交的方式,如果希望所有事务都不是自动提交的,那么通过修改 AUTOCOMMIT 来控制事务比较方便,这样不用在每个事务开始的时候再执行 START TRANSACTION 语句。
  • 如果在锁表期间,用 START TRANSACTION  命令开始一个新事物,会造成一个隐含的 UNLOCK TABLES 被执行。
  • 在同一个事务中,最好不使用不同存储引擎的表,否则 ROLLBACK 时需要对非事务类型的表进行特别的处理,因为 COMMIT、ROLLBACK 只能对事务类型的表进行提交和回滚。
  • 对 LOCK 方式加的表锁,不能通过 ROLLBACK 进行回滚。
  • 通常情况下,只对提交的事务记录到二进制的文件中,但是如果一个事务中包含非事务类型的表,那么回滚操作也会被记录到二进制日志中,以确保非事务类型表的更新可以被复制到从数据库(Slave)中。
  • 和 Oracle 的事务管理相同,所有的 DDL 语句是不能回滚的,并且部分的 DDL 语句会造成隐式的提交。
  • 在事务中可以通过定义 SAVEPOINT,指定回滚事务的一个部分,但是不能指定提交事务的一个部分。对于复杂的应用,可以定义多个不同的 SAVEPOINT,满足不同的条件时,回滚不同的 SAVEPOINT。需要注意的是,如果定义了相同名字的 SAVEPOINT,则后面定义的 SAVEPOINT 会覆盖之前的定义。对于不再需要使用的 SAVEPOINT,可以通过 RELEASE SAVEPOINT 命令删除 SAVEPOINT,删除后的 SAVEPOINT 不能再执行 ROLLBACK TO SAVEPOINT 命令。

分布式事务

  • MySQL 从5.0.3开始支持分布式事务,当前分布式事务只支持 InnoDB 存储引擎。一个分布式事务会涉及多个行动,这些行动本身是事务性的。所有行动都必须一起成功完成,或者一起被回滚。
  • 在 MySQL 中,使用分布式事务的应用程序设计一个或多个资源管理器和一个事务管理器

    资源管理器(RM)用于提供通向事务资源的途径。数据库服务器是一种资源管理器,该管理器必须可以提交或回滚由 RM 管理的事务。例如,多台 MySQL 数据库作为多台资源管理器或者几台 MySQL 服务器和几台 Oracle 服务器作为资源管理器。

    事务管理器(TM)用于协调作为一个分布式事务一部分的事务。TM 与管理每个事务的 RMs 进行通信。在一个分布式事务中,各个单个事务均是分布式事物的“分支事务”。分布式事务和各分支通过一种命名方法进行标识。

    • MySQL 执行 XA MySQL 时,MySQL 服务器相当于一个用于管理分布式事务中的 XA 事务的资源管理器。与 MySQL 服务器连接的客户端相当于事务管理器。
    • 要执行一个分布式事务,必须知道这个分布式事务涉及了哪些资源管理器,并且把每个资源管理器的事务执行到事务可以被提交或回滚时。根据每个资源管理器报告的有关执行情况的内容,这些分支事务必须作为一个原子性操作全部提交或回滚。要管理一个分布式事务,必须要考虑任何组件或连接网络可能会出现的故障。
    • 用于执行分布式事务的过程使用两阶段进行提交,发生时间由分布式事务的各个分支需要进行的行动已经被执行之后。

          在第一阶段,所有的分支被预备好。即他们被 TM 告知要准备提交。通常,这意味着用于管理分支的每个 RM 会记录对于被稳定保存的分支的行动。分支指示是否他们可以这么做。这些结果被用于第二阶段。

          在第二阶段,TM 告知 RMs 是否要提交或回滚。如果在预备分支时,所有的分支指示他们能够提交,则所有的分支被告知要提交。如果在预备时,有任何分支指示它将不能提交,则所有的分支被回滚。

事务控制和锁定语句

标签:ack   语句   出现   设计   事务控制   删除   事务性   文件   开始   

原文地址:https://www.cnblogs.com/ljg3020/p/14906496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!