1

我有一个使用 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 个或更多文档时,就会出现问题。这给了我一个“试图获得锁定时发现的死锁”。

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

4

1 回答 1

0

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

于 2013-02-09T12:55:07.467 回答