1

Java + Mysql を使用した SOAP ベースの Web サービスがあります。

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 サービスです。ありがとう。

4

1 に答える 1

0

データベース トリガー内にビジネス ロジックを実装しようとしています。トリガーの代わりに、このロジックを (1) Web サービス アプリケーション ミドルウェアまたは (2) ストアド プロシージャのいずれかに実装できます。ただし、アプローチ(1)を好みます。Docいずれかの基本的なコードは、ユーザーによるテーブルへのすべての挿入を累積カウンターに収集し、すべての挿入の最後にUserテーブルDocAvailable = DocAvailable -counterを一度に更新します。問題が発生した場合にロールバックできるように、トランザクションでこれを行うことができます。トランザクションを開始する前にDoc quota、利用可能なを読む必要があります。user

于 2013-02-09T12:55:07.467 に答える