我有一个基于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个或更多文档时,问题就出现了。这给了我一个“试图锁定时发现的死锁”。
有人有想法在没有死锁问题的情况下改善这一点,同时提供适当数量的文件吗?这是我的第一个网络服务。感谢。
答案 0 :(得分:0)
您正在尝试在数据库触发器中实现业务逻辑。您可以在(1)Web服务应用程序中间件或(2)存储过程中实现此逻辑,而不是触发器。我更喜欢方法(1)。其中的基本代码将由累积计数器中的用户收集Doc
表中的所有插入,并在所有插入的末尾,一次更新User
表DocAvailable = DocAvailable -counter
。您可以在事务中执行此操作,以便在出现问题时可以回滚。在开始交易之前,您必须阅读Doc quota
的可用user
。