日期:2014-05-16  浏览次数:20416 次

Mysql技术内幕InnoDB存储引擎——事务&备份&性能调优

事务

      transaction是数据库区别于文件系统的重要特性之一,innodb引擎完全符合事务的ACID特性。

      Atomicity 原子性

      Consistency一致性

      Isolation 隔离性

      Durability 持久性

7.1、事务概述

      Atomicity 原子性:整个数据库事务是不可分割的工作单位。

      Consistency一致性:事务将数据库从一种状态转变为下一种一致的状态。

      Isolation 隔离性:一个事务的影响在该事务提交前对其他事务都不可见。

      Durability 持久性:事务一旦提交,其结果就是永久性的。

7.2、事务的实现

      隔离性通过锁来实现,原子性、一致性、持久性通过数据库的redo和undo来完成。

7.2.1、redo

      innodb通过redo日志文件和innodb log buffer来实现redo。

      当事务开始时,innodb会记录该事务的一个LSN(Log Sequence Number,日志序列号)。当执行事务时,会往innodb log buffer写入事务日志。当事务提交时,必须将innodb存储引擎的日志缓存写入磁盘(默认的实现,通过innodb_flush_log_at_trx_commit=1)。这意味这磁盘上的页和内存缓冲池中的页是不同步的,

7.2.2、undo

      undo和redo相反,redo是重做,undo是撤销。使用rollback语句请求回滚就可以利用undo信息将数据回滚到修改之前的样子。redo存放在redo日志里面,undo存放在数据库内部的一个特殊段(undo segment),undo段位于共享表空间里。undo是逻辑操作,它实际上是做与之前相反的工作,之前是insert,它就delete对于每个update,undo都会执行一个相反的update,当插入操作回滚时,表空间的大小并不会因此而收缩。

7.3、事务控制语句

      AUTOCOMMIT = 0 关闭自动提交,等于1 开启自动提交。

      START TRANSACTION | BEGIN 显示的开启一个事务。

      COMMIT 提交你的事务。

      ROLLBACK 回滚。

      SAVEPOINT identifier SAVEPOINT允许你的事务中创建一个保存点,一个事务中可以有多个保存点。

      RELEASE SAVEPOINT identifier 删除一个事务的保存点。

      ROLLBACK TO [savepoint]identifier 回滚到之前创建的保存点,需要显示运行COMMIT或者ROLLBACK命令。

      SET TRANSACTION 这个语句用来设置事务的隔离级别,innodb的隔离级别在6.4已经说过了。

      completion_type = 0 时COMMIT和COMMIT WORK功能完全相同。

      completion_type = 1 时COMMIT WORK等于COMMIT AND CHAIN,表示提交后马上开启一个相同隔离级别的事务。

      complation_type = 2 时COMMIT WORK等于COMMIT AND RELEASE,当事务提交后会自动断开与服务器的链接。

7.4、隐式提交的SQL语句

      1.DDL语句

      2.CREATEUSER,DROPUSER,GRANT、RENAME USER,REVOKE,SET PASSWORD。

      3.ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE。

7.5、对于事务的统计

      QPS = Question Per Second = 每秒请求数。

      TPS = Transaction Per Second = 每秒事务处理能力。

      计算TPS的方法是com_commit + com_rollback/TIME = TPS。

7.6、事务隔离级别

      READ UNCOMMITTED(事务隔离最低的级别,有事务隔离就能解决更新丢失,但是存在脏读的问题)。

      READ COMMITED(ORACLE和SQL SERVER默认的隔离级别,解决了脏读,但是一个事务多次读取的内容不同,出现了不可重复读的问题)。

      READ REPEATABLE(可重复读,innodb引擎的默认事务隔离级别,解决了不可重复读的问题,但是产生了幻读,innodb通过Next-key lock解决了幻读)。

      SERIALIZABLE(可串行化,通过强制事务排序解决幻读问题,会降低性能)总的看来innodb默认的 READ REPEATABLE是非常棒的。

7.7、分布式事务

      innodb引擎支持XA分布式事务。

      分布式事务指营运需多个独立的事务资源(transactional resources)参与一个全局的事务中。事务资源通常是关系型数据库系统。全局事务要求在其中所有参与的事务要么都提交、要么都回滚,对于原有的ACID有了提高。注意:在使用分布式事务时,innodb存储引擎的事务隔离级别必须设置成SERIALIABLE。

      分布式事务由一个或多个资源管理器Resource Managers一个事务管理器Transaction Manager及一个应用程序Application Program。

         1.资源管