【问题标题】:Concurrent update in mysql row using trigger使用触发器在mysql行中并发更新
【发布时间】:2013-02-08 17:14:15
【问题描述】:

我有一个使用 Java + Mysql 的基于肥皂的 Web 服务。

Web 服务包括保存和发送作为响应生成的文档。每个用户都有有限数量的可用文档。该服务向外部系统提供文档,因此,我必须随时了解特定用户可用的文档。

为了改进这一点,构建一个触发器,在创建新文档时更新用户行。

CREATE TRIGGER `Service`.`discount_doc_fromplan`
AFTER INSERT ON `Service`.`Doc` FOR EACH ROW
UPDATE `Service`.`User` SET User.DocAvailable = User.DocAvailable - 1 where User.id = NEW.idUser

当用户因为他们的系统而试图同时创建 2 个或更多文档时,就会出现问题。这给了我一个“尝试获取锁定时发现死锁”。

有人想在没有死锁问题的情况下改进这一点,同时提供正确数量的可用文档?这是我的第一个网络服务。谢谢。

【问题讨论】:

    标签: java mysql web-services concurrency


    【解决方案1】:

    您正在尝试在数据库触发器中实现业务逻辑。您可以在 (1) Web 服务应用程序中间件或 (2) 存储过程中实现此逻辑,而不是触发器。我更喜欢方法(1)。两者中的基本代码将在累积计数器中收集用户在Doc 表中的所有插入,并在所有插入结束时,一次性更新UserDocAvailable = DocAvailable -counter。您可以在事务中执行此操作,以便在出现问题时可以回滚。在开始交易之前,您必须阅读user 的可用Doc quota

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多