并发操作数据

45 阅读2分钟

并发事务访问相同数据的情况可以分为3种:

  1. 读-读 N个客户端同时读同一份数据

多个请求读同一份数据,并不做修改,原则上来说是没有问题

  1. 写-写 N个客户端同时插入或者新增,修改,删除同一份数据

多个请求写,会出现脏写,任何一个事务隔离级别都是不允许存在脏写

所以在写的时候,要排队,如何如何排队,上锁,这个锁其实内存中的一种结构。

  1. 读-写 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");