行を挿入したいのですが、競合が発生した場合 (以下の例)、デバッグ目的でその内容をログに記録できるように、データベースで既存の行をロックしたいと考えています。READ_COMMITTED
トランザクション分離を使用しています。
例えば:
CREATE TABLE users(id BIGINT AUTO_INCREMENT, name VARCHAR(30),
count INT NOT NULL, PRIMARY KEY(id), UNIQUE(name));
Thread 1:
INSERT INTO users(username, count) VALUES('joe', 1000);
transaction.commit();
Thread 2:
// Insert fails due to conflict with above record
INSERT INTO users(username, count) VALUES('joe', 0);
// Get the conflicting row and log its properties
SELECT * FROM users WHERE username = 'joe';
競合する行がロックされていない場合、確認するまでに変更されている可能性があります。SELECT id FROM users WHERE username = 'joe' FOR UPDATE
私が見つけた唯一の回避策は、挿入の前に呼び出すことです。競合が発生しない場合、オーバーヘッドなしでこれを実装する方法はありますか?
更新:競合や結果を避けるように求めているわけSQLException
ではありません。競合する行をロックするように求めているだけなので、競合を引き起こした値を調べることができます。はい、競合するレコードに含まれていることはわかっていjoe
ますが、他のすべての列をログに記録したいと考えています。