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

