Java 使用触发器在mysql行中进行并发更新
我有一个使用Java+Mysql的基于soap的web服务 web服务包括保存和发送为响应生成的文档。每个用户的可用文档数量有限。该服务向外部系统提供文档,因此,我必须随时了解特定用户可用的文档 为了改进这一点,需要构建一个触发器,在创建新文档时更新用户行Java 使用触发器在mysql行中进行并发更新,java,mysql,web-services,concurrency,Java,Mysql,Web Services,Concurrency,我有一个使用Java+Mysql的基于soap的web服务 web服务包括保存和发送为响应生成的文档。每个用户的可用文档数量有限。该服务向外部系统提供文档,因此,我必须随时了解特定用户可用的文档 为了改进这一点,需要构建一个触发器,在创建新文档时更新用户行 CREATE TRIGGER `Service`.`discount_doc_fromplan` AFTER INSERT ON `Service`.`Doc` FOR EACH ROW UPDATE `Service`.`User` SET
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
当用户由于系统原因试图同时创建两个或多个文档时,就会出现问题。这给了我一个“尝试获取锁时发现的死锁”
有人想在不出现死锁问题的情况下,同时提供适当数量的可用文档来改进此功能?。这是我的第一个web服务。谢谢。您正试图在数据库触发器中实现您的业务逻辑。您可以在(1)web服务应用程序中间件或(2)存储过程中实现此逻辑,而不是触发器。不过,我更喜欢方法(1)。其中的基本代码将由用户在累积计数器中收集
Doc
表中的所有插入,并在所有插入结束时,一次性更新user
表DocAvailable=DocAvailable-counter
。您可以在事务中执行此操作,以便在出现问题时回滚。在开始交易之前,您必须阅读用户可用的文档配额