📜  JDBC-事务(1)

📅  最后修改于: 2023-12-03 15:32:06.299000             🧑  作者: Mango

JDBC 事务

在Java应用程序中,使用JDBC进行数据库交互时,经常需要执行多个操作并且需要保证这些操作的原子性。JDBC事务是一种机制,用于确保多个数据库操作以原子方式执行(即要么全部成功,要么全部失败)。

什么是事务?

在数据库中,事务是指一组操作,这些操作被视为单个工作单位。如果其中一个操作失败,则所有操作都将撤消,因此不会保留部分操作的状态。简而言之,事务要么全部完成要么全部失败/回滚。

例如,考虑从银行账户A向账户B转移资金的事务。如果第二个账户的转账失败,则第一个帐户中的资金保持不变,因此事务必须向后回滚以恢复一致性。

JDBC事务处理

JDBC提供了许多类和接口来处理数据库事务。其中最重要的是Connection类。事务处理步骤如下:

  1. 获取与数据库的连接
  2. 将auto-commit设置为false,这样您可以开始一个事务
  3. 执行这些事务
  4. 如果所有事务都成功,则提交事务。否则回滚。

例如,下面是使用JDBC API执行数据库事务的示例。在示例中,我们将转移给定帐户中的资金。

Connection connection = null;
PreparedStatement preparedStatement = null;

try {
    connection = DriverManager.getConnection(jdbcUrl, username, password);
    connection.setAutoCommit(false);
    
    //withdraw money from account A
    preparedStatement = connection.prepareStatement(
        "UPDATE accounts SET balance = balance - ? WHERE id = ?");
    preparedStatement.setInt(1, amount);
    preparedStatement.setInt(2, accountA);
    preparedStatement.executeUpdate();
    preparedStatement.close();
    
    // deposit money into account B
    preparedStatement = connection.prepareStatement(
        "UPDATE accounts SET balance = balance + ? WHERE id = ?");
    preparedStatement.setInt(1, amount);
    preparedStatement.setInt(2, accountB);
    preparedStatement.executeUpdate();
    preparedStatement.close();
    
    connection.commit();
} catch (SQLException e) {
    connection.rollback();
} finally {
    connection.setAutoCommit(true);
    connection.close();
}

在上面的示例中,我们首先获取与数据库的连接,然后将auto-commit设置为false。我们执行两个查询来从一个帐户中提取资金,然后将其存入另一个帐户。如果任何一项操作失败,则整个事务将被回滚,因为我们在SQLException中使用了connection.rollback()。否则,我们将提交事务。

JDBC事务隔离级别

在JDBC中,我们可以设置事务隔离级别。事务隔离级别定义了多个事务之间的可见性。较高的隔离级别相对于低隔离级别来说是更安全、更可靠的,但通常将无法效率高。

JDBC提供了以下四个事务隔离级别:

  1. 未提交读取:允许未提交的事务读取其他事务对数据库所做的更改
  2. 已提交读取:允许读取其他已提交的事务的更改
  3. 可重复读取:允许在事务执行期间多次读取同一行,并且不会看到其他事务所做的更改
  4. 串行化:将每个事务都按顺序处理,因此每个事务看到的所有更改都将按照提交时间进行排序

默认隔离级别是可重复读,但您可以在每个事务中设置隔离级别。

例如,下面是将隔离级别设置为未提交读取的示例。

Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
总结

JDBC事务是确保多个操作以原子方式执行的一种机制。我们可以使用JDBC API设置事务,并在其中执行多个查询。如果所有查询都成功,则事务将被提交。否则,它会被回滚。我们还可以设置事务的隔离级别,以确定多个事务之间的可见性。