数据并发控制
- 脏读:A事务还未提交,B事务就读到了A操作的结果。(破坏了隔离性)
- 不可重复读:A事务在本次事务中,对自己未操作过数据,进行多次读取,结果出现不一致或记录不存在的情况。(破坏了一致性,重点是update和delete)
- 幻读:A事务在本次事务中,先读取了一遍数据,发现数据不存在,过了一会,又读取了一遍,发现又有数据了。(破坏了一致性,重点是insert)
-
事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 会 会 会 不可重复读(read-committed) - 会 会 可重复读(repeatable-read)(mysql 默认) - - 对InnoDB不可能 串行化(serializable) - - -
方便记忆简称:脏不换(衣服脏了也不换 ,所以会有问题)
mysql默认隔离级别:不可重复读 已经解决了 衣服脏了不换 的问题 所以我们用mysql。
ps:脏读和不可重复读 区别:
脏读读到了其它事务没有提交的数据,不可重复度读 读到了其它事务提交的数据;
幻读:本事务两次读取数据不一致 重点新增了数据
--------------------------------------------------------------------------------------------------
解决多事务数据一致性 MVCC 模型
undolog里实现的
DB_ROW_ID 内置 id
DB_TRX_ID 谁创建了这条数据
DB_ROLL_PTR 回滚id 谁修改了,谁删除了
事务快照存在undolog里面
------------------mvcc模型----------------------------
只能对到本事务修改,和在第一次查询之前已经提交的事务的修改
------------------锁-------------------
1 共享锁 ,又称为读锁,简称S锁
共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能对不能修改。
select * from student where id = 1 lock in share mode;
释放锁事务结束
2 排他锁 不能与其他锁并存,如一个事务获取了一个数据行的排他锁,
其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取
了排他锁的事务是可以对数据行进行读取和修改。
加锁释锁方式:
自动:delete / update / insert 默认加上X锁;
手动:select * from student where id=1 FOR UPDATE;
释放锁:事务结束
锁的思考:------------
锁到底锁住了什么?
是一行数据 (Row )吗?
是一个字段 (Column)吗?
答:锁住了主键
锁的顺序 是聚簇索引的顺序
primary key
no null unique key
row id(全表扫描 锁整个表)
所以锁的时候一定命中索引字段,不然会锁表。
锁的算法----------------------------------
记录锁: 命中记录锁住一个具体记录
间隙锁:()锁住一个没有命中的范围 ,目的不让插入。
临键锁:把整个记录分成间隙,(](]
@先增:表可以只锁住一列吗?也就是说锁住A列,B列可以修改数据。
浙公网安备 33010602011771号