JDBC:事务

时间:2020-01-09 10:36:48  来源:igfitidea点击:

事务(Transaction)是作为单个原子动作执行的一组动作。或者所有动作都已执行,或者都不执行。

何时需要进行交易的经典示例是银行帐户示例。我们需要将100美元从一个帐户转移到另一个帐户。为此,我们需要从第一个帐户中减去$ 100,然后向第二个帐户中添加$ 100。如果从第一个银行帐户中扣除$ 100后此过程失败,则$ 100不会添加到第二个银行帐户中。这笔钱在网络空间中迷失了。

为了解决此问题,将$ 100的减法和加法合并为一笔交易。如果减法成功,但加法失败,则可以"回滚"第一个减法。这样,数据库将保持与执行减法之前相同的状态。

我们可以通过以下调用启动事务:

connection.setAutoCommit(false);

现在,我们可以继续执行数据库查询和更新。所有这些动作都是事务的一部分。

如果在事务中尝试执行的任何操作失败,则应回滚事务。这样做是这样的:

connection.rollback();

如果所有操作都成功,则应该提交事务。提交事务会使操作在数据库中永久存在。一旦提交,就没有回头路可走了。提交事务是这样完成的:

connection.commit();

当然,我们最终需要对这些操作进行一些尝试。这是一个例子:

Connection connection = ...
try{
    connection.setAutoCommit(false);

    // create and execute statements etc.

    connection.commit();
} catch(Exception e) {
    connection.rollback();
} finally {
    if(connection != null) {
        connection.close();
    }
}

这是一个完整的示例:

Connection connection = ...
try{
    connection.setAutoCommit(false);

    Statement statement1 = null;
    try{
        statement1 = connection.createStatement();
        statement1.executeUpdate(
            "update people set name='John' where id=123");
    } finally {
        if(statement1 != null) {
            statement1.close();
        }
    }

    Statement statement2 = null;
    try{
        statement2 = connection.createStatement();
        statement2.executeUpdate(
            "update people set name='Gary' where id=456");
    } finally {
        if(statement2 != null) {
            statement2.close();
        }
    }

    connection.commit();
} catch(Exception e) {
    connection.rollback();
} finally {
    if(connection != null) {
        connection.close();
    }
}