使用mySQL专栏是一种理智的方式来实现全局锁定吗?

时间:2012-04-28 22:32:13

标签: mysql distributed-transactions

我正在构建一个涉及重要图像处理的应用程序。我们在分布式庄园中构建它,任意数量的渲染机器接收从RabbitMQ交换机渲染图像的请求。

由于在渲染过程中可能会出现对图像的请求,并且因为我不想让两个渲染服务器重复工作,所以我在mySQL图像表中创建了一个名为is_rendering的列作为布尔值。

当渲染服务器收到渲染请求时,它遵循以下一系列步骤:

  1. 选择更新图像行
  2. 如果is_rendering == true中止呈现请求
  3. 设置is_rendering == true并提交事务
  4. 渲染图像并将缩略图存储在全局可访问的商店中
  5. 设置is_rendering == false并返回
  6. 它确实有效,但我担心这些频繁的数据库更新看起来有点傻。此外,我正在考虑渲染服务器在渲染过程中失败并留下is_rendering == true的边缘情况,从而阻止渲染该图像。我正在考虑这个问题的解决方案是将is_rendering列从tinyint(1)更改为datetime字段,并将锁定日期存储为“true”值,将null作为“false”值存储。定期服务运行状况检查可以选择is_rendering值超过特定时间段的所有行,并在这种情况下释放锁定。

    这是解决这个问题的理智方法,还是我应该考虑其他更优雅的方法?

2 个答案:

答案 0 :(得分:0)

亲爱的我了解您的问题,如果您遵循以下规则,您的第一种方法也是正确的: 1)你的表类型是innoDB。 2)您在代码中使用了事务。因为如果在更新期间发生任何分解,它将回滚。

最后,你的第二种方法也更好。如果你没有完成我提到的要点

答案 1 :(得分:0)

我已经将实施更改为使用DATETIME列。

如果这对我的SQL一般使用不当,我真的很好奇。根据我研究过的内容,我可以使用Hadoop的ZooKeeper:http://zookeeper.apache.org/doc/r3.1.2/recipes.html之类的内容,或谷歌内部的Chubby系统。由于这只是服务的第一次迭代,我将坚持使用mySQL。

从我在这里读到的内容,以及我在线阅读使用mySQL作为一种产生全局锁定的方法并不是一个糟糕的想法,并将其更改为DATETIME列,虽然有点迟钝,但是实现过期策略的最佳方法,以处理在处理作业过程中关闭的机器的奇数边缘情况。

保持事务级别锁定是另一种方法,但是当单个服务器运行具有小连接池的多个线程时它没有意义,它会不必要地占用连接,尽管它具有内置在客户端连接丢失时到期。