事务隔离级别
不可重复读与幻读区别
不可重复读,针对是更新和删除,可以基于行加锁.幻读是新增,RR级别需要
怎么解决幻读和不可重复读.
RC通过MVCC解决快照读的脏读问题
RR通过MVCC解决快照读的不可重复读和幻读问题,(中间没有更新过其他数据情况下)
RR级别通过间隙锁解决当前读的幻读问题(rr级别一直用当前读不会存在幻读问题)
备注:
RC隔离级别和RR隔离级别的mcvv实现不一样,RC可以理解为每次查询都创建一次快照,RR是一次事务只创建一次快照
RR级别下先快照读,(其他事务新增数据)当前事务更新数据,再快照读,就可能会出现幻读的问题
RR级别下先快照读,(其他事务更新数据)当前事务更新同一条数据,再快照读,就可能会出现不可重复读的问题
Start transaction
##步骤1
select roleid from test.user where id =1
##步骤3
update test.user set realname ='事务1更新' where id =1;
##步骤4
select roleid from test.user where id =1;
commit
##步骤2
Start transaction
update test.user set roleid =roleid+1 where id =1;
commit
按照上面步骤RR步骤1和步骤4查询出来的roleid不一样,算是不可重复读的一种,同样RR也有幻读问题
串行化问题
串行化是指完全串行地读,每次读取数据库中的数据时’都需要
获得表级别的共享 锁,读和写都会阻塞。
锁的分类
行锁主要加在索引上,如果对非索引的字段设置条件进行更新,
行锁可能会变成
表锁
临键锁(NextˉKeyLock)是行锁和间隙锁的组合
怎么避免死锁
1)尽量让数据表中的数据检索都通过索引来完成’避免无效索引导致行锁升级为表锁
2)合理设计索引’尽量缩小锁的范围
3)尽量减少查询条件的范围,尽量避免间隙锁或缩小间隙锁的范围
4)尽量控制事务的大小,减少一次事务锁定的资源数量,缩短锁定资源的时间
5)如果一条SQL语句涉及事务加锁操作,则尽量将其放在整个事务的最后执行
6)尽可能使用低级别的事务隔离机制
有了binlog为什么还需要redolog
崩溃的时候用redo log恢复快一点,
如果只有binlog,需要根据上次存档把这段时间的binlog的sql都重新执行一遍,效率很慢
binlog是主从同步的基础,事务提交是以binlog为标准的
提交步骤
恢复步骤:
如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交
如果 redo log 里面的事务处于 prepare 状态,则判断对应的事务 binlog 是否存在并完整
a. 如果 binlog 存在并完整,则提交事务;
b. 否则,回滚事务。