日期:2014-05-17  浏览次数:20399 次

请教一个关于锁定数据的问题
当用户编辑一条数据时,需要锁定该数据,以防止其他用户同时编辑或者删除该数据,我能想到的方案是:在数据表中增加一个IsLock字段,来标记是否锁定,当用户修改前,就设置IsLock为1,修改完成就修改IsLock为0,但有个问题,如果客户端非正常关闭,比如停电、或者断网,这个IsLock字段值就无法改回来,导致长期锁定。我想请问,还有什么更好的方案吗?
这个需求也可以衍生到防止同一个账号同时多处登录。
------解决方案--------------------
不需要进数据库,直接在业务层里加锁,需要修改时检查该条数据是否被锁,同时设置超时策略
可以用全局的cache来做
------解决方案--------------------
呵呵,楼主的这需求有些特殊

一般像你第一次说的,一用户编辑一行数据时,为防止别的用户操作该行数据,这种需求,我一般是选择使用数据库自身带有的锁,也就是我们常说的事务锁,如果你没玩过,可以谷歌一下  排他锁  共享锁 这几个关键字。这种事务锁对于像在线抽奖之类的网站,非常有用,它可以直接锁住整个表,细一点的,锁住表中的某一行,据官方说的,终极控制的话,可以锁住表中的某一行的某一列去。


而你说的第二种需求,数据表里增加特殊字段来控制用户不能同 时在多地登录,对于这一点,使用事务锁解决不了问题的,我给你个思路,你除了增加现在的字段外,额外添加另外两个字段,

比如,再增加一个 锁住人ID  , 还增加一个 最近被锁住的时间   这两个字段

这时候,你每次在用户请求编辑该行记录前,首先是 判断该行是否被锁住了? 如果被锁住了,则判断 之前锁住它的  锁住人ID   是否与当前请求的用户相同,相同,则允许, 不同? 不同的话,那说明之前锁住这行记录的是别人哦,那么,只能是被锁日期来判断了,比如锁住了2天了,那基本上可以确定之前锁住它的那个用户已掉线了,这时候就可以允许操作了,否则,继续等待吧