我想插入一行,但如果发生冲突(下面的示例),我希望数据库锁定现有行,以便我可以记录其内容以进行调试。我正在使用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
但我想记录它的所有其他列。