表锁
读锁
下面我们为user_info表加read锁,针对——session1
查询自己锁定的表
查询未锁定的表
多锁定的表进行更新或者插入
针对——session2
查询锁定的表
查询未锁定的表
更新锁定的表,处于阻塞状态
锁定的表,释放锁,session2更新成功,将abc改为ab。
写锁
多user_info加写锁——针对session1
查询锁定的表
对锁定的表进行更新
查询未锁定的表
释放锁
针对——session2
查询锁定的表,一直处于阻塞态
查询成功
总结:
总结读锁
Session1
1. 加读锁
2. 可以查自己锁定的表
3. 不可以查询其他没有锁定的表
4. 不能对读锁定的表进行插入或更新
Session2
1. 可以查询锁定的表,其他未锁定的表也可以查询
2.不能对锁定的表进行插入或更新,处于等待,等session1释放锁
总结写锁
session1
1.加写锁
2.查询锁定的表
3.可以对锁定的表进行更新
4.不可以查询未锁定的表
Session2
1.查询锁定的表,处于阻塞,等待释放锁,才可以访问。
2.可以查询未锁定的表
3.对锁定的表进行修改,处于阻塞,等待释放锁,才可以,和查询类似。
行锁
行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
关闭自动提交
set autocommit=0; // 0关闭,1开启
查询product_info
更新一条数据
再次查询,从6变为10
查询session2,依然是6
提交session1
查询session2
session2提交再查询
session1 更新查询
总结
session1
1.关闭自动提交
2.更新不提交,没有commit
3.commit
Session2
1.关闭自动提交
2.处于阻塞状态,一直等待
3.接触阻塞,更新正常进行,需要commit