jdbc事物|5-3

简介: jdbc事物|5-3

数据库事务(Transaction)是由若干个SQL语句构成的一个操作序列,有点类似于Java的synchronized同步。数据库系统保证在一个事务中的所有SQL要么全部执行成功,要么全部不执行,即数据库事务具有ACID特性:

Atomicity:原子性

Consistency:一致性

Isolation:隔离性

Durability:持久性

数据库事务可以并发执行,而数据库系统从效率考虑,对事务定义了不同的隔离级别。SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:

image.png

对应用程序来说,数据库事务非常重要,很多运行着关键任务的应用程序,都必须依赖数据库事务保证程序的结果正常。

举个例子:假设小明准备给小红支付100,两人在数据库中的记录主键分别是123和456,那么用两条SQL语句操作如下:

UPDATE accounts SET balance = balance - 100 WHERE id = 123 AND balance >= 100;
UPDATE accounts SET balance = balance + 100 WHERE id = 456;

这两条语句必须以事务方式执行才能保证业务的正确性,因为一旦第一条SQL执行成功而第二条SQL失败的话,系统的钱就会凭空减少100,而有了事务,要么这笔转账成功,要么转账失败,双方账户的钱都不变。

这里我们不讨论详细的SQL事务,如果对SQL事务不熟悉,请参考 SQL事务。

要在JDBC中执行事务,本质上就是如何把多条SQL包裹在一个数据库事务中执行。我们来看JDBC的事务代码:

Connection conn = openConnection();
try {
    // 关闭自动提交:
    conn.setAutoCommit(false);
    // 执行多条SQL语句:
    insert(); update(); delete();
    // 提交事务:
    conn.commit();
} catch (SQLException e) {
    // 回滚事务:
    conn.rollback();
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

其中,开启事务的关键代码是conn.setAutoCommit(false),表示关闭自动提交。提交事务的代码在执行完指定的若干条SQL语句后,调用conn.commit()。要注意事务不是总能成功,如果事务提交失败,会抛出SQL异常(也可能在执行SQL语句的时候就抛出了),此时我们必须捕获并调用conn.rollback()回滚事务。最后,在finally中通过conn.setAutoCommit(true)把Connection对象的状态恢复到初始值。

实际上,默认情况下,我们获取到Connection连接后,总是处于“自动提交”模式,也就是每执行一条SQL都是作为事务自动执行的,这也是为什么前面几节我们的更新操作总能成功的原因:因为默认有这种“隐式事务”。只要关闭了Connection的autoCommit,那么就可以在一个事务中执行多条语句,事务以commit()方法结束。

如果要设定事务的隔离级别,可以使用如下代码:

// 设定隔离级别为READ COMMITTED:
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

如果没有调用上述方法,那么会使用数据库的默认隔离级别。MySQL的默认隔离级别是REPEATABLE_READ。

相关文章
|
11月前
|
Oracle Java 关系型数据库
22JavaWeb基础 - JDBC事务
22JavaWeb基础 - JDBC事务
39 0
|
SQL 关系型数据库 MySQL
MySQL数据库之事物(详解)
MySQL数据库之事物(详解)
98 0
|
SQL Java 数据库连接
JDBC事务处理
JDBC事务处理
56 0
|
SQL Oracle Java
JDBC数据库事务
JDBC数据库事务
|
SQL Oracle 关系型数据库
jdbc数据库事务
jdbc数据库事务
jdbc数据库事务
|
SQL Oracle Java
JDBC事务控制管理
JDBC事务控制管理
107 0
JDBC事务控制管理
|
SQL 网络协议 Oracle
JDBC、数据库连接池以及事务的基本概念与使用
JDBC、数据库连接池以及事务的基本概念与使用
170 0
|
SQL Java 关系型数据库
JDBC中的事务 |学习笔记
快速学习JDBC中的事务
|
Java 数据库连接 数据库
|
SQL Java 关系型数据库
JDBC 中的事务 | 学习笔记
快速学习 JDBC 中的事务 。
103 0