1. 事务(Transaction)
    1. 事务基础
      1. 开始事务
        1. START TRANSACTION [WITH CONSISTENT SNAPSHOT] | BEGIN WORK
      2. 结束事务
        1. COMMIT【WORK】【AND 【NO】CHAIN】 【【NO】RELEASE】
      3. SET autocommit=
        1. 0, 取消自动提交,DML需要需要commit永久写入,也可以使用rollback,回滚
        2. 1,DML自动commit,无法rollback
    2. SAVEPOINT
      1. InnoDB支持SAVEPOINT和ROLLBACK TO SAVEPOINT
    3. 所谓的transaction mode是指autocommit=0的状态
  2. Main Topic 3
  3. MySQL的锁机制
    1. MySQL表级锁
      1. LOCK TABLES
        1. LOCK TABLES tbl_name [[AS] alias] Lock_type
        2. Lock_type类型:READ [LOCAL] | [LOW_PRIORITY]
          1. READ [LOCAL]: 当前session获得读锁
          2. 可以有多个session同时获得读锁
          3. 其它的session无需显示地获得读锁,也可以读取表
          4. LOCAL 标识符可以让其它的session进行无冲突的insert操作,不过对于InnoDB来说,LOCAL没有作用
          5. [LOW_PRIORITY] WRITE
          6. 当前session获得表的读写锁
          7. 只有获得该锁的session可以访问该表,其它session都不可以
          8. 所有对于该表的锁请求都会被block,直到write锁被释放
          9. LOW_PRIORITY的说明
          10. 一般情况下write锁的优先级要比read锁高
          11. LOW_PRIORITY使得read锁优先级比write要高
        3. 注意点
          1. 一个session要在一条lock tables语句中,获得它所需要的所有锁
          2. 如果一个session获得了某个锁,它只能访问获得了锁的表(INFORMATION_SCHEMA中的表例外)
        4. LOCAL TABLES按照以下方式获得锁
          1. 首先给所有要获得锁的表进行排序,对于用户来说,这个排序是透明的
          2. 如果一个表同时被请求了读锁和写锁,优先加上写锁
          3. 一次获得一个表的锁,直到当前的session获得所有的锁
      2. UNLOCK TABLES
        1. 显式地释放当前session在该表的所有锁
        2. 释放由"FLUSH TABLES WITH RAED LOCK"产生的GLOBAL READ LOCK
        3. 如果一个session已经获得了一些锁,同时又使用LOCK TABLES 语句,则自动释放这些已经获得的锁
        4. 如果一个session开始一个事务比如调用(START TRANSACTION),隐式调用UNLOCAK TABLES
      3. 对于异常的处理
        1. 如果一个session终止了,不管是正常的还是异常的,服务器会释放所有的锁
        2. 如果终止的session中有一个active transaction,服务器自动回滚这个transaction
        3. auto-reconnect对于客户端的操作有影响
    2. Table Locking Issues
      1. InnoDB提供了良好的行级锁,支持高并发性,所以不需要显式使用LOCK TABLES,这样反而降低效率
      2. 除了InnoDB和NDBCLUSTER这两个数据库引擎,其它的引擎都使用表级锁,所以使用了其它引擎的表最好只用来进行查询
      3. 由于锁的互斥性,表级锁的性能是相当低的,建议使用InnoDB
      4. 减少或 避免锁竞争开销的一些方式
        1. 使用InnoDB创建表
        2. 优化select语句,话费更少的时间,这样能减少写锁的等待时间
        3. 启动mysqld是使用--low-priority-updates
        4. 对于在一个connection中有多个update操作的情况,设置变量low priority updates = 1
        5. 可以给某些特定的INSERT,UPDATE或者DELETE操作低优先级
          1. INSERT LOW_PRIORITY....
        6. 给某些select高优先级,select high_priority
        7. 设置max_write_lock_count系统变量
        8. 拆分表信息
        9. DELETE LIMIT
        10. INSERT DELAYED
        11. SELECT SQL_BUFFER_RESULT