MySQL⽀持对MyISAM和MEMORY存储引擎的表进⾏表级锁定,对BDB存储引
擎的表进⾏页级锁定,对InnoDB存储引擎的表进⾏⾏级锁定。默认情况下,表锁和⾏ 锁都是⾃动获得的,不需要额外的命令。但是在有的情况下,⽤户需要明确地进⾏锁 表或者进⾏事务的控制,以便确保整个事务的完整性,这样就需要使⽤事务控制和锁 定语句来完成。
1 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}] . . UNLOCK TABLES
如表 14-1 所⽰是⼀个获得表锁和释放表锁的简单例⼦,演⽰的是 film_text 表获得
read锁的情况,其他session更新该表记录会等待锁,film_text表释放锁以后,其他 session可以进⾏更新操作。其中 session1和 session2表⽰两个同时打开的 session,表格 中的每⼀⾏表⽰同⼀时刻两个 session 的运⾏状况,后⾯的例⼦也都是同样格式,不再 重复说明。
默认情况下,MySQL 是⾃动提交(Autocommit)的,如果需要通过明确的Commit 和Rollback来提交和回滚事务,那么就需要通过明确的事务控制命令来开始事 务,这是和Oracle的事务管理明显不同的地⽅。如果应⽤是从Oracle数据库迁移到 MySQL数据库,则需要确保应⽤中是否对事务进⾏了明确的管理。
如果只是对某些语句需要进⾏事务控制,则使⽤START TRANSACTION语句开始⼀个事务⽐较⽅便,这样事务结束之后可以⾃动回到⾃动提交的⽅式,如果希望所有 的事务都不是⾃动提交的,那么通过修改 AUTOCOMMIT 来控制事务⽐较⽅便,这样 不⽤在每个事务开始的时候再执⾏START TRANSACTION语句。
如下表所⽰的例⼦演⽰了使⽤START TRANSACTION开始的事务在提交后⾃动 回到⾃动提交的⽅式;如果在提交的时候使⽤COMMIT AND CHAIN,那么会在提交 后⽴即开始⼀个新的事务。