简介

MySQL 支持对MyISAM 和MEMORY 存储引擎的表进行表级锁定,对BDB 存储引擎的表进行页级锁定,对InnoDB 存储引擎的表进行行级锁定。
默认情况下,表锁和行锁都是自动获得的,不需要额外的命令。但是在有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成。

语法

LOCK TABLE 和UNLOCK TABLE:

  • LOCK TABLES 可以锁定用于当前线程的表。如果表被其他线程锁定,则当前线程会等待,直
    到可以获取所有锁定为止。
  • UNLOCK TABLES 可以释放当前线程获得的任何锁定。当前线程执行另一个LOCK TABLES 时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁,
LOCK TABLES
tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...

LOCK TABLES
tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...
UNLOCK TABLES

UNLOCK TABLES

例子:

lock table film_text read;

select film_id,title from film_text
where film_id = 1001;

unlock tables;


lock table film_text read;

select film_id,title from film_text
where film_id = 1001;

unlock tables;

事务控制

MySQL 通过SET AUTOCOMMIT、START TRANSACTION、COMMIT 和ROLLBACK 等语句支持本地事务

//START TRANSACTION 或BEGIN 语句可以开始一项新的事务。
START TRANSACTION | BEGIN [WORK]
//COMMIT 和ROLLBACK 用来提交或者回滚事务。
//CHAIN 和RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立
//即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的连接。
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
//SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了SET AUTOCOMMIT=0,
//则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。
SET AUTOCOMMIT = {0 | 1}

//START TRANSACTION 或BEGIN 语句可以开始一项新的事务。
START TRANSACTION | BEGIN [WORK]
//COMMIT 和ROLLBACK 用来提交或者回滚事务。
//CHAIN 和RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立
//即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的连接。
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
//SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了SET AUTOCOMMIT=0,
//则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。
SET AUTOCOMMIT = {0 | 1}

默认情况下,MySQL 是自动提交(Autocommit)的,如果需要通过明确的Commit 和Rollback 来提交和回滚事务,那么需要通过明确的事务控制命令来开始事务

选择:
  • 如果只是对某些语句需要进行事务控制,则使用START TRANSACTION 语句开始一个事务
    比较方便,这样事务结束之后可以自动回到自动提交的方式
  • 如果希望所有的事务都不是自动提交的,那么通过修改AUTOCOMMIT 来控制事务比较方便,这样不用在每个事务开始的时候再执行START TRANSACTION 语句。
  • 如果在锁表期间,用start transaction 命令开始一个新事务,会造成一个隐含的unlock tables 被执行
  • 在同一个事务中,最好不使用不同存储引擎的表,否则ROLLBACK 时需要对非事务类型的表进行特别的处理,因为COMMIT、ROLLBACK 只能对事务类型的表进行提交和回滚。