mysql学习笔记(四)

事物ACID特性:
原子性,一组sql要么全部执行,要么全部不执行。
发送sql->bufferPool内存修改->产生Redo/Undo日志->刷盘->成功或异常
事物提交了,BP没有刷盘,用redo来保证修改不失效。
事物没提交,BP已刷盘了,用undo来保证数据的还原.

持久性,事物提交后,在库里的数据改变是永久的。
一般的提交骤:提交->写binlog日志->发送binlog(主从)->在座引擎提交->日志刷新(redo,undo)->刷盘->事物提交成功。
原子性保证数据的逻辑持久性,刷盘保证数据的物理持久性。

隔离性
一个事物不被其它事物影响。一般是通过事物锁来实现,如行锁。

一致性 事物开始前后,数据的完整性没有破坏,约束一致。
数据的一致性由原子性、持久性、隔离性共同保障。

事物并发问题
更新丢失:多事物更新同一条记录。可分为回滚覆盖和提交覆盖。
脏读:一个事务读取到另一个事物修改但未提交的事物。
不可重复读:一个事务中,多次读取同一行记录,后面读取的与前面读取的不一致。
幻读:一个事务中,多次按相同条件查询,后续查询与前面查询记录数不一致。

事物的演进:
排队:事务挨个执行,实现简单,并发能力低,强一致性要求的场使用。
排他锁(互斥锁),读先加锁谁先执行
读写锁,细化锁,读和读之前不加锁。
MVCC:多版 本并发控制
MVCC在RC,RR中使用,
可分为快照读,读记录的快照,有可能读到的是历史数据。
当前读,读最新的版本。

隔离级别与事务并发问题支持性:
级别 回滚覆盖 脏读 不可重复读 提交覆盖 幻读
读未提交 x v v v v
读已提交 x x v v v
可重复读 x x x x v
串行化 x x x x x

锁的分类:
按操作粒度分:
表锁–>读写并发能力低,但冲突小
行锁–>并发能力高
页级锁->介于和锁和行锁间,用得少
按操作类型分:
读锁–>相互不受影响,又叫共享锁
写锁–>写操作没完成时,阻断其他锁,又叫排他锁

按操作性能分:
乐观锁–>如版本比对,时间戮比对
悲观锁–>写之前先把记录锁住,共享锁和排它锁都属于悲观锁。

innodb行锁是通过对索引数据页上的记录加锁实现的。
记录锁 锁单选记录,RC,RR支持
范围锁(间隙锁) 锁记录间隙,RR支持
记录间隙锁,RR支持

主键更新:直接锁住那行记录就够了
索引更新:锁记录和相邻间隙,间隙左右不能做insert操作。
无索引加锁:会导致全记录和间隙加锁。

查询排他锁可通过 select * from xxx for update实现。update和delete默认加行锁。查询共享锁可通过lock in share mode实现。

死锁:
用户A–>访问A表(锁住)–>B表(等B释放锁)
用户B–>访问B表(锁住)–>A表(等A释放锁)
互相持有对方需要的锁就发生死锁。

死锁的一般原因:
1、无索引查询记录时,会引发全表扫描,行锁上升为表锁,这样的事务很容易死锁阻塞。
2、2个事务分别拿头对方的锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值