JDBC 事务处理

JDBC 的事务处理是基于 Connection 接口的,通过 Connection 对象进行事务管理。

JDBC 默认事务处理行为是自动提交。有三个相关方法:

  • setAutoCommit:设置自动提交;
  • commit:提交事务;
  • rollback:回滚事务。

示例准备

在 maven 中引入相关依赖:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

测试代码,包含了使用 JDBC 进行连接数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class OrderTest {
private String driver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/shiwu?useUnicode=true&characterEncoding=utf8";
private String user = "root";
private String password = "root";

@Test
public void addOrder() {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection(url, user, password);
//内容
} catch (SQLException e) {
e.printStackTrace();
//内容
} finally {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

事务处理实现

因为 JDBC 默认事务处理行为是自动提交,所以先要使用 Connection#setAutoCommit(false) 方关闭自动提交机制。

  1. 接着进行一系列逻辑处理,如果没有异常产生,使用 Connection#commit() 方法提交事务。代码如下,位于 try 代码块中:

    1
    2
    3
    4
    5
    conn.setAutoCommit(false);
    stmt = conn.createStatement();
    stmt.execute("<SQL 语句>");
    stmt.execute("<SQL 语句>");
    conn.commit();
  2. 如果产生了异常,使用 Connection#rollback() 方法回滚事务,代码如下,位于 catch 代码块中:

    1
    2
    3
    4
    5
    try {
    conn.rollback();
    } catch (SQLException e1) {
    e1.printStackTrace();
    }

事务隔离级别

JDBC 提供了对事物隔离级别的设置,其表示的隔离级别如下:

  • TRANSACTION_NONE:不支持事务;

  • TRANSACTION_READ_UNCOMMITTED :读未提交;

  • TRANSACTION_READ_COMMITTED:读已提交;

  • TRANSACTION_REPEATABLE_READ:可重复读;

  • TRANSACTION_SERIALIZABLE:串行化。

    当开启 JDBC 的事务处理后,默认的隔离级别为 TRANSACTION_REPEATABLE_READ

查询与设置隔离级别的方法:

  • Connection#getTransactionIsolation:查询当前隔离级别;
  • Connection#setTransactionIsolation:设置隔离级别。
坚持原创技术分享,您的支持将鼓励我继续创作!