mysql问题

事务隔离级别

不可重复读与幻读区别

不可重复读,针对是更新和删除,可以基于行加锁.幻读是新增,RR级别需要

 怎么解决幻读和不可重复读.

Innodb MVCC实现原理

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. 否则,回滚事务。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值