Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果扩展方法的范围,您不太可能忘记这样做。+1,但是:(1)“如果只是选择,我不会打开事务”取决于DBMS,因为在某些情况下,您总是处于事务中;(2)我同意你的观点,你应该回滚这个案例,但说“没有讨论”,这是一种逃避,因为OP在声明回滚和提交在语义上是等价_Java_Sql_Database_Jdbc_Transactions - Fatal编程技术网

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;
        }
}