于《高性能MYSQL》一书中可以到得知
事务隔离级别
1、READ UNCOMMITED(读未提交):在这个级别中,即使没有提交,对其他事物也是可见的,事务可以读取未提交的数据,这也称之为脏读。这个会造成很多问题,从性能来说,并不比其他的隔离级别好太多,但是缺乏其他隔离级而别的好处,除非整的有非常必要的,实际应用中很少见。
2、READ COMMITED(读已提交):大多数数据库系用默认得隔离级别是这个(mysql不是),一个事务在开始时,只能看到已经提交得事务所做的修改,意思是:一个事务从开始到commit提交之前,所做的任何修改都是对其他事务不可见,即前后两次读取到的结果不一样。
3、REPEATABLE READ(可重复读:MYSQL默认的事务隔离级别):这个隔离级别解决了脏读和在同一个事务中多次读取得结果不一致。但是可重复读无法解决幻读得问题,幻读指当前事务在读取某个范围内得记录时,另外的一个事务对该范围内插入了数据,当当前事务再次读取到记录时,发现记录比之前得行数要多也就是(幻行)。mysql得InnoDB和XtraDB存储引擎通过MVCC(多版本并发控制)解决了幻读的问题。
4、SERIALIZABLE(可串行化:MYSQL最高隔离级别):通过事务得强制串行化执行,避免了幻读得问题,这个隔离级别会对读取得每一行数据加锁,可能导致大量的超时和锁征用得问题。实际上很少用这个隔离级别,只有在非常需要确保数据一致性的情况且没有并发的情况下才考虑使用这种方式。
这四种隔离级别中只有可串行话是加锁读,其他都是无锁读。
MVCC
MVCC是多版本并发控制,,mysql大多数事务型存储引擎实现的都不是简单的行级锁,为了提升并发性能得考虑,实现了MVCC,不仅是mysql,oracle和postgreSQL也是先了MVCC,的但是各自实现得机制不一样,因为没有一个标准。 MVCC是行级锁得一个变种,在一些情况下避免了加锁操作,因此开销很低,各种数据库大都是实现了非阻塞大的读操作,写操作也只是锁定必要的行。 MVCC得实现,是通过保存数据在某个时间点的快照来实现得。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务的开始时间不同,每个事务对同一张表,同一时刻看到的数据可能不一样得。
InnoDB得MVCC,是通过每行记录后面保存两个隐藏函数得列来实现大的。这两个列,一个化是保存了行得创建时间,一个是保存行得过期时间(或者删除时间)。存储的并不是实际的时间值,而是一个系统的版本号。每开始一个新的事务,系统版本号会自动递增。
参考样图
在MySQL中建表时,每个表都会有三列隐藏字段,其中和MVCC有关系的有两个字段:数据行的系统版本号 (DB_TRX_ID)和删除版本标识(DB_ROLL_PT)