mysql 事务及innodb隔离级别
体系结构
查看innodb状态
mysql> show engine innodb status \G
事务
原子性
- 事务的所有操作,要么全部完成,要么全部不完成。重做日志(redo log)
 
一致性
- 事务开始之前和结束之后,数据库的完整性限制未被破坏。回滚段(undo log)
 
隔离性
- 当多个事务并发访问数据库中的同一数据时,所表现出来的相互关系。锁(lock)
 
持久性
- 事务完成之后,事务所做的修改持久化保存,不会丢失。
 
innodb事务隔离级别
- READ UNCOMMITTED
 - 可以看到其他事务未提交的数据。事务1更新了数据还未提交,但是事务2居然能看到更新后的数据!这是脏读。
 - READ COMMITTED
 - 能看到其他事务提交的数据。事务1进行select,事务2进行更新并提交,事务1再select居然会看到和之前不同的数据!这是不可重复读。
 - 读取最新数据。
 - oracle默认级别
 - REPEATABLE READ
 - 一个事务里的开始点的select和任何时刻select看到的数据一样。
 - 但会有幻读。
 - MySQL默认级别
 - SERIALIZABLE
 - 读操作会隐式的加S锁,保证不同事务之间互斥。
 - 保证串行
 
参数
- innodb_lock_wait_timeout
 - 等待锁超时时间
 - innodb_rollback_on_timeout
 - 超时后是否回滚
 - Transaction_isolation(>=5.7.20)
 - 事务隔离级别
 
表空间
mysql表空间自动默认一个表一个表空间
innodb_flush_log_at_trx_commit参数实验
mysql> create table test_load(a int, b char(80))engine=innodb;
mysql> delimiter //
mysql> create procedure p_load(count int unsigned)
    -> begin
    -> declare s int unsigned default 1;
    -> declare c char(80) default repeat('a',80);
    -> while s <= count do
    -> insert into test_load select null,c;
    -> commit;
    -> set s = s+1;
    -> end while;
    -> end;
    -> //
mysql> set global innodb_flush_log_at_trx_commit=1;
mysql> call p_load(50000);
Query OK, 0 rows affected (10 min 2.59 sec)
mysql> set global innodb_flush_log_at_trx_commit=2;
mysql> call p_load(50000);
Query OK, 0 rows affected (2 min 36.99 sec)
mysql> set global innodb_flush_log_at_trx_commit=0;
mysql> call p_load(50000);
Query OK, 0 rows affected (4 min 2.33 sec)
dynamic
• 把text, blob等大字段直接放在其他page中
• 只在原page中存储20字节指针
查看lsn号
mysql> show engine innodb status \G
                    
                
                
            
        
浙公网安备 33010602011771号