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