Java 如果扩展方法的范围,您不太可能忘记这样做。+1,但是:(1)“如果只是选择,我不会打开事务”取决于DBMS,因为在某些情况下,您总是处于事务中;(2)我同意你的观点,你应该回滚这个案例,但说“没有讨论”,这是一种逃避,因为OP在声明回滚和提交在语义上是等价
Java 如果扩展方法的范围,您不太可能忘记这样做。+1,但是:(1)“如果只是选择,我不会打开事务”取决于DBMS,因为在某些情况下,您总是处于事务中;(2)我同意你的观点,你应该回滚这个案例,但说“没有讨论”,这是一种逃避,因为OP在声明回滚和提交在语义上是等价,java,sql,database,jdbc,transactions,Java,Sql,Database,Jdbc,Transactions,如果扩展方法的范围,您不太可能忘记这样做。+1,但是:(1)“如果只是选择,我不会打开事务”取决于DBMS,因为在某些情况下,您总是处于事务中;(2)我同意你的观点,你应该回滚这个案例,但说“没有讨论”,这是一种逃避,因为OP在声明回滚和提交在语义上是等价的之后,特别询问了这个案例。@ruakh(1)我完全同意。对于(2),我编辑了答案,将其纳入注释中。JDBC始终启动一个事务(要么是自动提交,要么需要手动提交/回滚)。没有不启动事务的选项。有些数据库确实有“只读”连接选项,这意味着为该连接处理
如果扩展方法的范围,您不太可能忘记这样做。+1,但是:(1)“如果只是选择,我不会打开事务”取决于DBMS,因为在某些情况下,您总是处于事务中;(2)我同意你的观点,你应该回滚这个案例,但说“没有讨论”,这是一种逃避,因为OP在声明回滚和提交在语义上是等价的之后,特别询问了这个案例。@ruakh(1)我完全同意。对于(2),我编辑了答案,将其纳入注释中。JDBC始终启动一个事务(要么是自动提交,要么需要手动提交/回滚)。没有不启动事务的选项。有些数据库确实有“只读”连接选项,这意味着为该连接处理更便宜的事务。很好。虽然我甚至会让异常冒泡通过,以不丢失任何有用的错误信息,例如途中的错误消息,而不仅仅是返回false。
try {
doSomeQuery()
// b) success
} catch (SQLException e) {
// a) failed (because of exception)
}
try {
if (deleteById(2))
// a) delete successful (1 row deleted)
else
// b) delete unsuccessful (0 row deleted, no errors)
} catch (SQLException e) {
// c) delete failed (because of an error (possibly due to constraint violation in DB))
}
// Initialize a var we can test against later
// Lol, didn't realize this was for java, please excuse the var
// initialization, as it's demonstrative only
$queryStatus = false;
try {
if (deleteById(2)) {
$queryStatus = true;
} else {
// I can do a few things here
// Skip it, because the $queryStatus was initialized as false, so
// nothing changes
// Or throw an exception to be caught
throw new SQLException('Delete failed');
}
} catch (SQLException $e) {
// This can also be skipped, because the $queryStatus was initialized as
// false, however you may want to do some logging
error_log($e->getMessage());
}
// Because we have a converged variable which covers both cases where the API
// may return a bool, or throw an exception we can test the value and determine
// whether rollback or commit
if (true === $queryStatus) {
commit();
} else {
rollback();
}
try {
deleteById(2);
// Because the API dev had a good grasp of error handling by using
// exceptions, we can also do some other calls
updateById(7);
insertByName('Chargers rule');
// No exception thrown from above API calls? sweet, lets commit
commit();
} catch (SQLException $e) {
// Oops exception was thrown from API, lets roll back
rollback();
}
if (deleteById(2)) {
commit();
} else {
rollback();
}
$queryStatus = true;
if (!deleteById(2)) {
$queryStatus = false;
}
if (!updateById(7)) {
$queryStatus = false;
}
...
if (true === $queryStatus) {
commit();
} else {
rollback();
}
public boolean example()
{
Connection conn;
...
try
{
...
//Do your SQL magic (that can throw exceptions)
...
conn.commit();
return true;
}
catch(...)
{
...
return false;
}
finally
{//Close statements, connections, etc
...
closeConn(conn);
}
}
public static void closeConn(Connection conn)
{
if (conn != null)
if (!conn.isClosed())
{
if (!conn.getAutoCommit())
conn.rollback();//If we need to close() but there are uncommitted transacitons (meaning there have been problems)
conn.close();
conn = null;
}
}