Mysql学习

1.MySQL的每一行都会有三个默认隐藏字段row_id, tx_id ,roll_point分别是行id,事务id,roll_point回滚指针,指向的是上一个版本的数据

 事务自己可以读到自己的改动,这个就是版本链

2.ReadView

 在读已提交的隔离级别,每次查询会更新m_ids也就是活跃的事务id,如果数据的事务id是在这个里面,就去读上一个版本,这样就不会查询出没有提交的数据,第二次查询会更新这个m_ids,但是在可重复读这个级别,生成了ReadView后,第二次查询不会更新m_ids

3.MVCC 

就是为了提高读性能

4.普通的读操作,不会涉及到加锁

 

 查看锁情况:

5,行锁和表锁

5.索引与锁

读已提交隔离下通过for update加写锁时:

 A:使用主键查询时,只需要在主键值对应的那一条数据加锁即可

 B:  使用唯一索引查询时,也是只需要在索引那一条数据加锁即可

 C: 使用普通索引查询时,也是只需要在索引那一条数据加锁即可

D:不适用索引查询,全表扫描时,也是加行锁

E:插入数据,可以插入

在读已提交的隔离级别:所有的写锁都是加在行上的,不管是用到索引还是走全表扫描都是行锁

在可重复读隔离级别:

读的情况下是和读已提交是一样,但是会加间隙锁(写锁),导致插入数据阻塞(这是为了解决幻读情况,通过间隙锁,让其他事务无法插入进去),但是在间隙外的是没有加锁的

比如所select *from t where a >1 for update 

for update就是加写锁,在可重复读下,会加一个间隙锁,阻塞其他事务更改或插入数据,并且如果是全表扫描的话,会将所有关联数据以及间隙加锁(也是为了解决幻读)

一致性的非锁定读是指Innodb存储引擎通过行多版本控制的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行DELETE或者UPDATE操作,这时读取操作不会因此去等待行上锁的释放,相反的,Innodb存储引擎会去读取行的一个快照数据。

Mysql中在读已提交和可重复读两个事务隔离级别下,Innodb使用非锁定一致性读。然而对于快照数据的定义却不相同,在读已提交隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据,而在可重复读级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本

事务的隔离性由锁来实现,原子性,一致性,持久性通过数据库的redolog和undo log来完成,redo log称为重做日志,用来保证事务的原子性和持久性。undo log用来保证事务的一致性。

为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,Innodb存储引擎都需要调用一次fsync操作。由于重做日志文件打开并没有使用O_DIRECT选项,因此重做日志缓冲先写入文件系统缓存。为了确保重做日志写入磁盘,必须进行一次fsync操作。由于fsync的效率取决于磁盘的性能,因此磁盘的性能决定了事务提交的性能,也就是数据库的性能。

二进制日志binlog是数据库层的日志,redo log和undo log是innodb层的日志,binlog仅在事务提交时产生,

InnotDB存储引擎默认支持的隔离级别是 可重复读,但是与标准SQL不同的是,InnoDB存储引擎在可重复读事务隔离级别下,使用Next-key Lock锁的算法,因此避免了幻读的产生,这与其他数据库是不同的,所以说,Innodb存储引擎在默认事务隔离级别下就已经能完全保证事务的隔离性要求,即达到SQL标准的SERIALIZABLE隔离级别

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值