-
事务(Transaction)
-
事务基础
-
开始事务
- START TRANSACTION [WITH CONSISTENT SNAPSHOT] | BEGIN WORK
-
结束事务
- COMMIT【WORK】【AND 【NO】CHAIN】 【【NO】RELEASE】
-
SET autocommit=
- 0, 取消自动提交,DML需要需要commit永久写入,也可以使用rollback,回滚
- 1,DML自动commit,无法rollback
-
SAVEPOINT
- InnoDB支持SAVEPOINT和ROLLBACK TO SAVEPOINT
- 所谓的transaction mode是指autocommit=0的状态
- Main Topic 3
-
MySQL的锁机制
-
MySQL表级锁
-
LOCK TABLES
- LOCK TABLES tbl_name [[AS] alias] Lock_type
-
Lock_type类型:READ [LOCAL] | [LOW_PRIORITY]
- READ [LOCAL]: 当前session获得读锁
- 可以有多个session同时获得读锁
- 其它的session无需显示地获得读锁,也可以读取表
- LOCAL 标识符可以让其它的session进行无冲突的insert操作,不过对于InnoDB来说,LOCAL没有作用
- [LOW_PRIORITY] WRITE
- 当前session获得表的读写锁
- 只有获得该锁的session可以访问该表,其它session都不可以
- 所有对于该表的锁请求都会被block,直到write锁被释放
- LOW_PRIORITY的说明
- 一般情况下write锁的优先级要比read锁高
- LOW_PRIORITY使得read锁优先级比write要高
-
注意点
- 一个session要在一条lock tables语句中,获得它所需要的所有锁
- 如果一个session获得了某个锁,它只能访问获得了锁的表(INFORMATION_SCHEMA中的表例外)
-
LOCAL TABLES按照以下方式获得锁
- 首先给所有要获得锁的表进行排序,对于用户来说,这个排序是透明的
- 如果一个表同时被请求了读锁和写锁,优先加上写锁
- 一次获得一个表的锁,直到当前的session获得所有的锁
-
UNLOCK TABLES
- 显式地释放当前session在该表的所有锁
- 释放由"FLUSH TABLES WITH RAED LOCK"产生的GLOBAL READ LOCK
- 如果一个session已经获得了一些锁,同时又使用LOCK TABLES 语句,则自动释放这些已经获得的锁
- 如果一个session开始一个事务比如调用(START TRANSACTION),隐式调用UNLOCAK TABLES
-
对于异常的处理
- 如果一个session终止了,不管是正常的还是异常的,服务器会释放所有的锁
- 如果终止的session中有一个active transaction,服务器自动回滚这个transaction
- auto-reconnect对于客户端的操作有影响