要点に直行しましょう。新しい行をリレーショナル データベースに同時に挿入するアプリケーションがあります。1 つの多対 1 リレーションのエンドポイントで、後で使用するためにトリガーを使用して子行数を追跡したいと考えています。残念ながら、新しいデータに同じ親行 ( applicant
) への参照が含まれている場合、DEADLOCKS が発生します。更新された行の同時ロックを取得するには? ここに私のトリガーがあります:
DROP TRIGGER IF EXISTS `incrementEntryCountTrigger`; 区切り記号 $$ CREATE TRIGGER `incrementEntryCountTrigger` AFTER INSERT ON trademark FOR EACH ROW 始める 申請者の更新 SET entryCount=entryCount+1, entryCountChanged=1 WHERE 申請者.id=NEW.申請者_id; END$$ 区切り文字; DROP TRIGGER IF EXISTS `decrementEntryCountTrigger`; 区切り記号 $$ CREATE TRIGGER `decrementEntryCountTrigger` AFTER DELETE ON商標の各行 始める 申請者の更新 SET entryCount=entryCount-1, entryCountChanged=1 WHERE 申請者.id=OLD.申請者_id; END$$ 区切り文字;
trademark
テーブルの構造
CREATE TABLE `trademark` ( `id` int(11) NOT NULL AUTO_INCREMENT, `applicationDate` 日時 DEFAULT NULL, `applicationNumber` varchar(255) DEFAULT NULL, `class` varchar(255) DEFAULT NULL, `creationDate` 日時 DEFAULT NULL, `deleted` tinyint(4) DEFAULT NULL, `imageDownloaded` tinyint(4) DEFAULT NULL, `modified` 日時 DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `registrationDate` datetime DEFAULT NULL, `登録番号` varchar(255) DEFAULT NULL, `trademarkType` varchar(255) DEFAULT NULL, `applicant_id` int(11) DEFAULT NULL, `country_id` int(11) DEFAULT NULL, `service_id` int(11) DEFAULT NULL, 主キー (`id`)、 UNIQUE KEY `uniqueApplicationPerServiceContraint` (`applicationNumber`,`service_id`), KEY `FK_sv7x27shne6cro3hch7who6vr` (`applicant_id`), KEY `FK_4fuuxl1srjn7svpby7rd6j1er` (`country_id`), KEY `FK_1g62lp3kjl15f789m7netvlsk` (`service_id`), CONSTRAINT `FK_1g62lp3kjl15f789m7netvlsk` FOREIGN KEY (`service_id`) REFERENCES `service` (`id`), CONSTRAINT `FK_4fuuxl1srjn7svpby7rd6j1er` FOREIGN KEY (`country_id`) REFERENCES `country` (`id`), 制約 `FK_sv7x27shne6cro3hch7who6vr` 外部キー (`applicant_id`) 参照 `applicant` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2101 DEFAULT CHARSET=utf8