-
事务(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对于客户端的操作有影响
-
Table Locking Issues
- InnoDB提供了良好的行级锁,支持高并发性,所以不需要显式使用LOCK TABLES,这样反而降低效率
- 除了InnoDB和NDBCLUSTER这两个数据库引擎,其它的引擎都使用表级锁,所以使用了其它引擎的表最好只用来进行查询
- 由于锁的互斥性,表级锁的性能是相当低的,建议使用InnoDB
-
减少或 避免锁竞争开销的一些方式
- 使用InnoDB创建表
- 优化select语句,话费更少的时间,这样能减少写锁的等待时间
- 启动mysqld是使用--low-priority-updates
- 对于在一个connection中有多个update操作的情况,设置变量low priority updates = 1
-
可以给某些特定的INSERT,UPDATE或者DELETE操作低优先级
- INSERT LOW_PRIORITY....
- 给某些select高优先级,select high_priority
- 设置max_write_lock_count系统变量
- 拆分表信息
- DELETE LIMIT
- INSERT DELAYED
- SELECT SQL_BUFFER_RESULT