mysql锁机制怎么才能只锁一个人,其他人不受上一个人影响?

baagee 发布于 2016/09/03 12:24
阅读 371
收藏 1

想做的就是这个人只能按照顺序操作数据库3次,只能阻塞他自己的操作,其他人不受影响::::::::

一个人操作数据库三次,第一次完成之后才能进行下一次操作,

在这期间其他人也操作数据库三次,但是不受上一个人的影响,

用mysql排它锁,  这个人可以操作这个表,其他人只能阻塞,会影响效率,其他人也受前一个人的影响了。
文件锁我也考虑了,同样下一个人会阻塞啊,影响效率

想做的就是这个人只能按照顺序操作数据库3次,只能阻塞他自己的操作,其他人不受影响。。

这个问题实际是:一个人每天数据库最多产生三条他的数据,可能是1,2条;但是现在偶尔会出现大于3条的数据,(可能原因是数据记录慢,在记录第二条时,第一条还没记录,这时查询数据库,他的记录比实际少一条,所以最后总数据数会大于3);为了解决这个问题,想着必须上一条记录完毕后,下一条才能记录。可能我是小白,问的问题描述不当,请为你们有什么好方法解决这个问题吗?

加载中
0
eechen
eechen
程序用户表增加一个操作次数字段num,初始值3,每操作1次减1:
UPDATE user SET num=num-1 WHERE id=xxx AND num>0
UPDATE成功则继续操作,否则退出.
baagee
baagee
不行啊,不是这种
0
宏哥
宏哥
换postgresql 没有那么多鸟事了
eechen
eechen
等阿里丁奇发布AliSQL吧,带我等PHPer装逼带我等飞。
0
乌龟壳
乌龟壳
其实你自己都没想清楚要做什么吧?不然请说清楚。最好直接上表结构上SQL说明你想做什么。
乌龟壳
乌龟壳
回复 @baagee : 还有,既然每个用户都有各自的记录,你除非lock table,不然select for update怎么会互相影相?你的问题中太多含混不清的东西,所以最好做一个案例出来说比较合适。说不定你在做案例(抽象问题)的过程中,自己就找到答案了。
乌龟壳
乌龟壳
回复 @baagee : 你描述得很清楚了,但是我觉得不会有这种需求会发生,如果第二条依赖第一条记录,你程序里应该在第一条记录完后再出发生成第二条的代码,怎么会又有依赖又并发?
乌龟壳
乌龟壳
回复 @baagee : 比如程序在T1时间,记录了R1,在T2时间记录了R2,那R2和R1有什么关系?你是不是要读R1有没有还是什么之类的,为什么R2要依赖R1。这些细节你没交带清楚。最好你设计一个很简单的表结构,然后把你想做的事情分层三个insert,告诉我们你想做什么。
baagee
baagee
我说清楚了,可能你没明白。就是一个人每天数据库最多产生三条他的数据,可能是1,2条;但是现在偶尔会出现大于3条的数据,(可能原因是数据记录慢,在记录第二条时,第一条还没记录,这时查询数据库,他的记录比实际少一条,所以最后总数据数会大于3);为了解决这个问题,想着必须上一条记录完毕后,下一条才能记录。可能我是小白,问的问题描述不当,请为你有什么好方法解决这个问题吗?
0
houhou-
houhou-

很多解决方案(前提是超过三条对业务影响较大):

1 建议,效率最高,不影响主表的性能。针对每日条数在redis或者数据库记录一下,redis使用incr(并设置缓存时间为自然天,或者缓存key使用日期,缓存时间可以略长) mysql 使用 update count_f_table set count_falg = (count_falg+1) where  count_flag < 4;

2 mysql或orcale中有个sql语法可以行锁   如  select * from t for update where uid = update_uid(这个不会锁表,只会锁对应的数据)

3 使用数据路由,根据uid将写操作分发至单机(可以是负载均衡的地方,也可以服务路由,比如使用zk,判断uid的hash值,对应应该由哪个服务处理)  ,单机怎么保证写,这就简单了,直接使用语言自己的同步方法就行了

0
houhou-
houhou-

引用来自“houhou-”的评论

很多解决方案(前提是超过三条对业务影响较大):

1 建议,效率最高,不影响主表的性能。针对每日条数在redis或者数据库记录一下,redis使用incr(并设置缓存时间为自然天,或者缓存key使用日期,缓存时间可以略长) mysql 使用 update count_f_table set count_falg = (count_falg+1) where  count_flag < 4;

2 mysql或orcale中有个sql语法可以行锁   如  select * from t for update where uid = update_uid(这个不会锁表,只会锁对应的数据)

3 使用数据路由,根据uid将写操作分发至单机(可以是负载均衡的地方,也可以服务路由,比如使用zk,判断uid的hash值,对应应该由哪个服务处理)  ,单机怎么保证写,这就简单了,直接使用语言自己的同步方法就行了

其实还有最简单的,性能也是非常好的,需要根据业务折衷的方案。

在你插入数据之后进行一次条数的check,因为是根据uid 查询,因此效率也很高。如果超过了3条,删除最后的那条便是(如果是根据这个条数去调用其他服务执行操作就需要回滚其他服务了,这时候其实不太适用)

0
开源红薯烹调技术专家
开源红薯烹调技术专家
数据库加个字段 做减处理,只有还能减时才能批准后续的操作,然后直接利用mysql的计划事件每天零点重置回3就好啦!
返回顶部
顶部