并发事务访问相同数据的情况可以分为3种:
- 读-读 N个客户端同时读同一份数据
多个请求读同一份数据,并不做修改,原则上来说是没有问题
- 写-写 N个客户端同时插入或者新增,修改,删除同一份数据
多个请求写,会出现脏写,任何一个事务隔离级别都是不允许存在脏写
所以在写的时候,要排队,如何如何排队,上锁,这个锁其实内存中的一种结构。
- 读-写 N个客户端有的读有的写同一份数据
分类:
读锁、共享锁、排他锁、意向锁、自增锁
大类:
表级锁,行级锁,页级锁
对锁的态度
悲观锁、乐观锁
- 悲观锁:
总是会假设出最坏的情况,每次去获取数据的时候,都会默认为别人会修改数据,
所以每次拿数据的时候都会上锁,这样就导致其他人获取数据的时候都会被阻塞。
秒杀系统
100商品秒杀活动,200个
- 乐观锁:
就是同一数据被操作的时候,默认为并发操作不会发生,或者属于小概率,不会每次都对数据上锁,
但是在更新的时候,往往会判断一下有没有人去更新这个数据,也就是不用数据库自身锁机制,
而是通过应用层去判断。在程序中可以可以采用 版本号的机制,或者cas机制来实现。
乐观锁适用于多读的应用类型,这样可以提高吞吐量。
-- 角色表 id,角色名称 所以在这里insert的时候,要先查询 select 有没有role_name叫管理员
insert into role(id,role_name) values (1,"管理员");
insert into role(id,role_name) values (2,"管理员1");