2013-02-08 58 views
1

我有一个基于soap的web服务,使用Java + Mysql。使用触发器在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个或更多文档时。这给了我一个“尝试锁定时发现的死锁”。

有人有一个想法来改善这种没有死锁问题,同时有适当数量的文件可用?这是我的第一个Web服务。谢谢。

回答

0

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