分类: Mysql/postgreSQL
2014-09-22 23:03:41
7.2 事务的实现
7.2.1 redo
·事务日志通过重做日志文件、InnoDB存储引擎的日志缓冲实现
·开始一个事务时,记录该事务的一个日志序列号LSN(log sequence Number)
·当事务执行时,会往InnoDB存储引擎的日志缓冲中插入事务日志
·当事务提交时,必须将InnoDB的日志缓冲写入磁盘
·预写日志方式(WAL),就是写数据前,需要先写日志
例:
建立表z,并创建load_test存储过程:
>create table z(a int,primary key(a))engine=innodb;
>DELIMITER//
>create procedure load_test(count int)
>begin
>declare i int unsigned default 0;
>start transaction;
>while i
>insert into z select i;
>set i=i+1;
>end while;
>commit;
>end;
>//
通过命令观察当前日志重做情况:
>show engine innodb status\G;
Log sequence number 304734560
Log flushed up to 304734560
Last checkpoint at 304734560
调用存储过程load_test(10000),插入10000条记录
>call load_test(10000);
通过命令观察新的日志重做情况,跟第一次情况作对比:
>show engine innodb status\G;
Log sequence number 304767789
Log flushed up to 304767789
Last checkpoint at 304757460
7.2.2 undo
·用于对事物进行回滚撤销
·对数据库进行修改时,数据库不但会产生redo,还会产生一定量的undo
·redo存放在重做日志文件中,undo存放在数据库内部一个特殊段中(undo段)
·undo段位于共享表空间内
·InnoDB存储引擎回滚时,实际上做的是与先前相反的工Insert-delete,update-update
7.3 事务控制语句
START TRANSACTION|BEGIN
COMMIT
ROLLBACK
SAVEPOINT identifier
RELEASE SAVEPOINT identifier
ROLLBACK TO SAVEPOINT identifier
SET TRANSACTION [READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE]
7.5 对于事务操作的统计
·show global status like ‘com_commit’\G;
·show global status like ‘com_rollback’\G;
7.6事务隔离级别
7.7 分布式事务
·分布式事务由一个或多个资源管理器,一个事务管理器,一个应用程序组成
资源管理器:提供访问事务资源的方法。通常一个数据库就是一个资源管理器
事务管理器:协调参与全局事务中的各个事务。需要与参与全局事务中的资源管理器 进行通信
应用程序:定义事务的边界,指定全局事务中的操作
java 分布式事务支持 -JTA
7.8 不好的事务习惯
·在循环中提交事务
·使用自动提交
·使用自动回滚