体系结构
查看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