mysql数据库脏字段清洗_利用mysql解决并发读脏数据(发号注册系统)

在分发注册密码的web交互程序中,普通的,不考虑并发的设计如下:

设计一个表:一个字段是id,一个字段是需要分发的密码,另一个是标志位,标志该密码是否已经分发,初始是0;

程序设计:从表里找到一个标志位为0的密码,设置该标志位1,然后发给用户。

但这个方法问题是当用户的访问是高并发的时候,多个用户会得到相同的密码,

原因是(猜想仅供参考):

mysql的数据库操作方式是类似操作系统的读写锁,就是允许多个读锁同时操作,此时是不允许写的,当读锁放开的时候允许写,同理当写锁起作用的时候,读锁是阻塞的。所以,当用户高并发的时候,多个读锁可以一起读,第一个读锁释放后,它要将标志位置为1,但由于有其它读锁在读,所以第一个操作的写锁阻塞在这里,不能够将刚读到的这一行的标志字段,及时设置为1。并发的其他读锁读到的标志位还是0,当所有的并发读锁都释放后,所有操作的写锁开始起作用,多个并发的写操作阻塞执行,依次将该位置为1。这样多个并发的操作读的都是一条数据。

解决这个问题的方法是,仍旧利用mysql的读写锁的机制,对于这种机制,写锁一定互斥的,虽然允许同时多个读操作,但永远只允许一个写操作。刚才的问题是多个读数据的操作并发执行造成的,要避免这个,需要对读取的时候也加锁,不允许并发读取。我不知道mysql有没有这方面的设置直接来实现,但可以通过如下取巧的方式解决。

由于在写入的时候锁是互斥的,所以再建立一个表,只保存一个字段即可,就是一个自增的id,当有操作需要申请密码的时候,先在这个表里插入一条空数据,这样返回一个mysql分配的自增的id,用这个id去第一个表里取相应该id的密码就可以了。

不会出现多个用户得到同样密码的解释是,此时多个并发的操作肯定可以得到不同的id,因为在插入的时候写锁是互斥的,并发的多个操作要想写数据库,就会阻塞排队,第一个操作写入后,释放了该锁,获得mysql分配的id,其后的操作需要执行insert操作,mysql就会将这个操作顺序插入数据库的不同行,返回不同的id,此时虽然操作是并发的,同时到达的,但对于mysql来说,是一条一条执行插入语句,所以当然操作的是不同的行,返回不同的id,这样在第一个表里找到的就是不同的密码,用户分配到的也是不同的密码。

当这个分配的id大于密码表里的id总数时候,表示密码全部发送完。

这个原理可以用于其它需要防止并发读脏数据的程序,mysql的读写锁可以帮助我们来做其它的互斥程序。那天听到吴浩说memcache也有类似的读写锁,不知道如果用那个是不是可以提高并发效率,要比操作mysql快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值