使用触发器在mysql行中并发更新

时间:2013-02-08 17:14:16

标签: java mysql web-services concurrency

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

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

有人有想法在没有死锁问题的情况下改善这一点,同时提供适当数量的文件吗?这是我的第一个网络服务。感谢。

1 个答案:

答案 0 :(得分:0)

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