【问题标题】:Best approach to lock editing certain record in DB锁定编辑数据库中某些记录的最佳方法
【发布时间】:2021-10-23 08:50:30
【问题描述】:

我正在做一个spring boot项目,任务是:我应该在创建后锁定产品的编辑能力15分钟,所以基本上如果用户创建一个产品,这个产品将被锁定15分钟编辑,之后它可以从数据库中更改或删除。 我的问题是:实现这一目标的最佳方法是什么:

1- 我应该在数据库表中添加一个名为 lastUpdate 的字段,然后检查是否超过 15 分钟的时间。

2- 我是否应该将所有新创建的产品保存在数组中并每 15 分钟清除一次该数组。

或者在性能和最佳实践方面有什么更好的方法?

我正在使用带有 JPA 和 mysql 的 springboot。

谢谢。

【问题讨论】:

  • 您需要使用数据库。如果您在内存中执行此操作,那么该限制将不会在您的系统重新启动后继续存在,并且可能会使其难以扩展,因为您的服务实例需要将最近创建的产品与所有其他实例进行通信。
  • 你想要的概念叫做乐观锁定,你可以使用HTTP的If-Match或者If-Unmodified-Since headers。

标签: java mysql spring spring-boot


【解决方案1】:

您应该使用 InnoDB 中可用的锁定。

相反,您应该在某个表中有一些列来控制锁。应该是TIMESTAMP,这样你就可以判断15分钟是否用完了。

如果“过期”和“删除”是由某些 db 操作(尝试使用该项目等)触发的,请将其作为该 db 操作的一部分进行检查。过期检查(和删除)应该是包含该操作的事务的一部分;这使用 InnoDB 锁定,但只是短暂的。

如果没有此类操作,则使用 MySQL EVENT 或操作系统“cron 作业”每隔几分钟运行一次以清除超过 15 分钟的任何内容。 (清除会有一点延迟,但这不重要。

如果您提供项目生命周期内可能出现的 SQL 语句,我可能会更具体。

【讨论】:

    【解决方案2】:

    您可以检查一下您的更新方法和删除方法。如果方法很多,可以使用AOP。

    【讨论】:

      【解决方案3】:

      您可以使用上述两种功能。

      首先,最好在表格中有一个 lastUpdated 字段,这将有助于您将来使用其他功能。

      然后您可以拥有一个内部缓存(具有时间和对象引用的地图),将对象存储在其中并限制对它们的编辑。您可以运行调度程序来检查每分钟并从地图中清除对象并使其可用于更新。

      【讨论】:

      • 如果系统重启,这个缓存不会丢失吗?
      • 是的。如果你想通过缓存来管理它,你可以有一个相同的表。
      【解决方案4】:

      您可以将新产品放入“incoming_products”表中,并在该表中放入您设置为 date_add(now(), INTERVAL 15 MINUTE) 的时间戳列。

      然后在我们的 Boot 应用程序中每分钟运行一个@Scheduled 方法,检查是否有时间戳列为

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 2011-02-07
        相关资源
        最近更新 更多