我有一个查询,它试图在表中插入一行。由于主键约束失败,查询可能会失败,因为已经存在具有该 ID 的行。
我可以在尝试插入之前检查这一点,但我也可以通过检查 SQLException 的 SQL 状态来检测这一点。这是做这种事情的有效方法吗?还是我应该事先做明确的检查?
我问的原因是,如果我必须在执行插入之前进行显式检查,我将不得不锁定我正在检查的表以防止不一致。使用错误代码检查意味着我不必锁定表。
事先检查
try {
con.setAutoCommit(false);
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM SomeTable WHERE Id = 123");
if(rs.next()) {
con.setAutoCommit(true);
System.err.println("Entry with Id 123 already exists!");
return;
}
statement = con.createStatement();
statement.executeQuery("INSERT INTO SomeTable(Id) VALUES(123)");
con.commit();
con.setAutoCommit(true);
} catch(SQLException e) {
// These 2 lines actually need to be wrapped in a try/catch too.
con.rollback();
con.setAutoCommit(true);
}
错误代码检查
try {
Statement = con.createStatement();
statement.executeQuery("INSERT INTO SomeTable(Id) VALUES(123)");
} catch(SQLException e) {
if(e.getSQLState().equals("23505"))
System.err.println("Entry with Id 123 already exists!");
}