mysql-存储引擎

2020-11-20  本文已影响0人  bug_ling

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引擎提交读级别解决了不可重复读的问题

上一篇下一篇

猜你喜欢

热点阅读