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
原文地址:https://www.cnblogs.com/Knight7971/p/9634683.html