事务隔离性如何保证?

事务隔离性如何保证?

1.通过锁

2.通过MVCC(事务隔离级别无锁的实现方式,用于提高事务的性能)

不加锁性能肯定比加锁要高。

如何通过MVCC实现事务隔离性?

什么是MVCC?

MVCC 多版本并发控制。通过维护多版本的数据,以不加锁的方式实现事务的隔离性,本质上是CAS操作,是一种乐观锁的思想。

MVCC实现事务隔离级别的流程:
关键概念:

1.隐藏字段:

DB_TRX_ID:事务id,

roll_pointer:回滚指针,

rowid:未维护主键时自动生成的主键。

2.undolog:维护多版本的数据,形成数据链

3.ReadView:在查询操作时生成,用于定位数据链中数据。

包含三个字段:

creator_trx_id:当前进行查询的事务id

min_trx_id:未提交事务id中最小的事务id

max_trx_id:还未提交的事务id

4.判别规则:

4.1:如果creator_trx_id=trx_id,返回当前数据

4.2:如果trx_id

4.3:如果trx_id>max_trx_id,获取上一版本数据重新开始

4.4:min_trx_id

判断trx_id是否在未提交事务中,

如果在,返回上一版本数据重新开始,

如果不在,返回当前数据。

5.事务隔离级别:
5.1:读未提交:什么问题都不解决

5.2读已提交:解决脏读问题

5.3可重复读:解决脏读,不可重复读问题(MySQL默认级别)

5.4:串行化:解决脏读,不可重复读,幻读的问题

幻读和脏读的区别:脏读更专注于某条记录,而幻读更专注于某张表。

MVCC实现事务隔离性的流程:

1.读未提交:不需要任何操作,不需要版本控制。

2.读已提交:在每次读取时形成一个ReadView,根据ReadView中的creator_trx_id,min_trx_id,

max_trx_id字段和最新数据的trx_id按照前面的判别条件进行判断,如果条件都不满足,则根据数据链获取上一版本数据再次判断,直到满足为止。

3.可重复读:只在第一次读取的时候形成ReadView,其他和读已提交一样。

4.串行化:不使用MVCC,对整张表加表锁实现事务的隔离性。

你可能感兴趣的:(MySQL八股详究,数据库,MySQL,事务)