合肥网站开发外包,怎么给网站做优化,如何做网络运营,深圳公司开发网站前言
复习下隔离级别#xff1a; 1、读未提交#xff1a;一个事务还没提交时#xff0c;它做的变更就能被别的事务看到。 2、读提交#xff1a;一个事务提交之后#xff0c;它做的变更会被其他事务看到 3、可重复读#xff1a;一个事务执行过程中看到的数据#xff0c;…前言
复习下隔离级别 1、读未提交一个事务还没提交时它做的变更就能被别的事务看到。 2、读提交一个事务提交之后它做的变更会被其他事务看到 3、可重复读一个事务执行过程中看到的数据总是跟这个事务在启动时看到的数据是一致的。未提交的数据对其他事务不可见 4、串行化对于同一行记录“写”会加“写锁”“读”会加“读锁”。当出现读写锁冲突的时候后访问的事务必须等前一个事务执行完成才能继续执行
当前读 快照读
表记录有两种读取方式。 1、快照读读取的是快照版本。普通的SELECT就是快照读。通过mvcc来进行并发控制的不用加锁。不加锁 2、当前读读取的是最新版本。UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE是当前读。加锁
快照读情况下InnoDB通过mvcc机制避免了幻读现象。而mvcc机制无法避免当前读情况下出现的幻读现象。因为当前读每次读取的都是最新数据这时如果两次查询中间有其它事务插入数据就会产生幻读。
MySQL是如何避免幻读 在快照读情况下MySQL通过mvcc来避免幻读。 在当前读情况下MySQL通过next-key来避免幻读加行锁和间隙锁来实现的。 next-key包括两部分行锁和间隙锁。行锁是加在索引上的锁间隙锁是加在索引之间的。
Serializable隔离级别也可以避免幻读会锁住整张表并发性极低一般不会使用。
在可重复读下快照读和当前读怎么实现
1、快照读是通过MVCC(多版本控制)和undo log来实现的 2、当前读是通过加record lock(记录锁)和gap lock(间隙锁)来实现的。如果需要实时显示数据还是需要通过加锁来实现。这个时候会使用next-key技术来实现。
在mysql中提供了两种事务隔离技术第一个是mvcc第二个是next-key技术(record lock行锁 gap lock间隙锁)。 不加lock inshare mode之类的就使用mvcc。否则使用next-key。 mvcc的优势是不加锁并发性高。缺点是不是实时数据。 next-key的优势是获取实时数据但是需要加锁。
快照是什么时候生成的
1、在读未提交隔离级别下快照是什么时候生成的 没有快照因为不需要怎么读都读到最新的。不管是否提交
2、在读已提交隔离级别下快照是什么时候生成的 SQL语句开始执行的时候。
3、在可重复读隔离级别下快照是什么时候生成的 事务开始的时候可能会有很多条select SQL语句执行快照生命周期是到事务结束的时候
4、在串行化隔离级别下快照是什么时候生成的 “写”会加“写锁”“读”会加“读锁”读的的数据都是当前最新的数据没有快照当前读
怎么知道当前执行语句是当前读还是快照读
1、在默认隔离级别可重复读下select语句默认是快照读
select * from table id 1;2、select语句加锁是当前读 共享锁
select * from table id 1 lock in share mode;排他锁
select * from table where id 1 for update;3、update、insert、delete 语句当前读行锁
update table set a 1;
delete from table where id 1;
inert into table ...