mysql - 使用 mySQL 列是实现全局锁定的明智方法吗?

标签 mysql distributed-transactions

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

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

当渲染服务器收到渲染请求时,它会遵循一系列如下所示的步骤:

  1. 选择更新图像行
  2. 如果 is_rendering == true 中止渲染请求
  3. 设置 is_rendering == true 并提交事务
  4. 渲染图像并将缩略图存储在全局可访问的存储中
  5. 设置 is_rendering == false 并返回

它确实有效,但我担心这些频繁的数据库更新看起来有点傻。此外,我正在考虑渲染服务器在渲染过程中失败并离开 is_rendering == true 的边缘情况,从而阻止该图像被渲染。我正在考虑解决这个问题的方法是将 is_rendering 列从 tinyint(1) 更改为 datetime 字段,并将锁定日期存储为“true”值,将 null 存储为“false”值。定期服务健康检查可以选择超过特定时间段且具有 is_rendering 值的所有行,并在这种情况下释放锁定。

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

最佳答案

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

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

关于mysql - 使用 mySQL 列是实现全局锁定的明智方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10368144/

相关文章:

php - 如何从数据库中选择最近的 gps 坐标?

php - SQL查询成功但数据没有更新

php - 我应该如何将我的 mysql 数据库设置为我的 php 文档模板?

php - 在插入时获取一张表的 auto_increment 值的最佳方法

database - 在提交事务之前传递 JMS 消息

java - 如何检测我必须使用的 Helper 类来缩小我的 Corba 对象?

java - 系统在线或离线的解决方案

mysql - 从 MySQL 的一个随机列中选择 2 个随机记录

mysql - 获取最接近按类型分组的特定日期的记录