mysql-存储引擎
1、innodb
1.1、什么是事务及其特性
事务:是指程序中一系列严密的逻辑操作,而且所有操作必须全部完成,否则在每个操作中所作的所有更改都会被撤销
特性:
原子性(automicity):强调事务的不可分割,事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
一致性(consistency):事务的执行前后数据的完整性保持一致,事务的执行使数据从一个状态转换为另外一个状态,但是对于整个数据的完整性保持稳定
隔离性(isolation):一个事务执行的过程中,不应该受到其他事务的干扰,比如操作一张表时,数据库为每一个用户开启的事务,不能被其他事务所干扰,多个并发事务之间要相互隔离
持久性(durability):当事务正确完成后,它对于数据的改变是永久性的
1.2、事务的隔离级别
read uncommitted:读未提交,就是一个事务读取另一个未提交事务的数据
read committed:读已提交,就是一个事务等另一个事务提交后才能读取数据 - - 可避免脏读
repeatable read:可重复读,就是在开始读取数据时,不再允许修改操作 -- 可避免脏读、不可重复读的发生
serializeable:是事务最高的隔离级别,在该级别下,事务串行话顺序执行,可避免脏读、不可重复读、幻读,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不用
查看当前的事务隔离级别:show variables like '%isolation%';
设置事务的隔离级别:set session transaction isolation level read uncommitted;
读未提交的情况:
set session transaction isolation level read uncommitted;
事务A和事务B的隔离级别都是read uncommited,当事务A更新数据时,事务B能读取到事务A未提交的更改
读已提交的情况:
set session transaction isolation level read committed;
事务A和事务B的隔离级别都是read committed,当事务A更新数据时,事务B能读取到事务A已提交的更改
重复读的情况:
set session transaction isolation level repeatable read;
事务A和事务B的隔离级别都是epeatable read,当事务A更新数据时,事务B能读取不到事务A已提交的更改,只有等事务B结束后才可看到更改
隔离级别和锁同看
1.3、不同的隔离级别所导致的问题
脏读:
一个事务可以读取另一个未提交事务的数据。需要进行读已提交
不可重复读:
一个事务进行读取,分别读取到不同的数据。如:事务A对数据进行查询时,此时事务B对数据进行了修改并提交,然后事务A又对数据进行查询,发现数据和之前查找的不一样,从而导致两次读取的数据不一样。出现这种问题的根本原因是事务A在进行读操作时,其他事务对数据进行了修改
读提交是不能解决此问题的,需要进行可重复读就能解决
幻读:
一个事务进行读取,分别读取到了不同的数据。需要注意的是这里针对的是数据条数,可以理解为针对多笔数据时个数据集,重点是对数据的新增,所以对表加锁可以解决
不可重复读和幻读的区别:
从总的来看,两者都是对数据进行了两次查询,但两次查询的结果都不一样
但从控制的角度来看,两者的区别就比较大,前者只需要锁住满足条件的记录,后者,要锁住满足条件及相近的记录
避免不可重复读需要锁行,避免幻读需要锁表;不可重复读重点在于update和delete,而幻读的在于insert
注意:MVCC在InnoDB引擎提交读级别解决了不可重复读的问题