JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务
在关系型数据库中,有一个很重要的概念,叫做事务(Transaction)。它具有 ACID 四个特性:
- A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
- C(Consistency):一致性,事务必须是使数据库从一个一致性状态变到另一个一致性状态。
- I(Isolation):隔离性,一个事务的执行不能被其他事务干扰。
- D(Durability):持久性,,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
2. JDBC 的事务支持
在 JDBC 学习笔记(三)—— JDBC 常用接口和类,JDBC 编程步骤,我曾经提及,JDBC 是使用 Connection 来控制事务的。
Connection 默认使用自动提交策略,即关闭事务,这种情况下,每一条 SQL 语句一旦执行,就会立即提交到数据库,无法回滚。
Connection 提供了以下三个事务相关的接口:
// 关闭自动提交,开启事务
void setAutoCommit(boolean autoCommit) throws SQLException; // 提交事务
void commit() throws SQLException; // 回滚事务
void rollback() throws SQLException;
setAutoCommit(boolean autoCommit) 方法其实做了两件事情:
- 更改提交策略
- 开启事务
try (Connection conn = Connector.getSqlConnection()) {
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql1);
stmt.executeUpdate(sql2);
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
而以下写法则不会自动回滚:
try (Connection conn = Connector.getSqlConnection()) {
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql1);
stmt.executeUpdate(sql2);
} catch (SQLException e1) {
e1.printStackTrace();
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
3. Savepoint
JDBC 另外提供了一个 Savepoint 接口,用来实现事务部分提交。
有时候,我们并不希望一个事务全部执行,或者全部不执行,可能会有这样的需求:
如果执行到某一步出错,回滚的时候返回之前开启事务之后的某一个点。
这时候就需要 Savepoint(这个和 Hiberbate 的隔离级别很类似)。
通过以下示例代码,在执行 sql3 的时候出错,但是由于在执行完 sql1 的时候使用了 Savepoint,所以第一条 SQL 语句的执行结果会保留到数据库中:
package com.gerrard.demo; import com.gerrard.util.Connector;
import com.gerrard.util.DriverLoader; import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement; public final class SavePointDemo { public static void main(String[] args) {
String sql1 = "INSERT INTO STUDENT (STUDENT_NAME, STUDENT_PASSWORD) VALUES ('Ramsey', '999999')";
String sql2 = "INSERT INTO STUDENT (STUDENT_NAME, STUDENT_PASSWORD) VALUES ('Wilshere', '888888')";
// Invalidate SQL
String sql3 = "INSERT INTO STUDENT VALUES(1, 'Ramsey', '999999')"; DriverLoader.loadSqliteDriver();
try (Connection conn = Connector.getSqlConnection()) {
conn.setAutoCommit(false);
Savepoint save1 = null;
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql1);
save1 = conn.setSavepoint();
stmt.executeUpdate(sql2);
stmt.executeUpdate(sql3);
} catch (SQLException e) {
conn.rollback(save1);
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC 学习笔记(十一)—— JDBC 的事务支持的更多相关文章
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- JDBC学习笔记之JDBC简介
1. 引言 JDBC API是一种Java API,可以访问任何类型的表格数据,特别是存储在关系数据库中的数据. JDBC可以帮助我们编写下列三种编程活动的java应用程序: 1.连接到数据源,如数据 ...
- JDBC学习笔记一
JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...
- JDBC 学习笔记(六)—— PreparedStatement
1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- python3.4学习笔记(十一) 列表、数组实例
python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...
随机推荐
- Exceptions and Errors on iOS
异常:程序缺陷导致:不可恢复:给开发者使用: 错误:资源受限导致:可恢复:提示给用户. https://blog.jayway.com/2010/10/13/exceptions-and-errors ...
- 【BZOJ3940】[USACO2015 Feb] Censoring (AC自动机的小应用)
点此看题面 大致题意: 给你一个文本串和\(N\)个模式串,要你将每一个模式串从文本串中删去.(此题是[BZOJ3942][Usaco2015 Feb]Censoring的升级版) \(AC\)自动机 ...
- How to save console output to a file in Eclipse
https://coderanch.com/t/278299/java/Writing-output-console-file-system File file = new File("te ...
- 绑定Ligerui中的ligerComboBox二级联动
$.ajax({ url: "HRHandler.ashx", data: "bz=getDepartData", cache: false, type: &q ...
- 讲说问题:|和||的区别以及&和&&的区别。2、Java中的数据类型分几类?基本数据类型有哪些?
|和||的区别以及&和&&的区别. |或 为或运算 判断为逻辑或 || 为短路或 只有逻辑判断 当左侧为真不再继续判断 &与 为与运算 判断为逻辑与 && ...
- 抽象类&接口区别
抽象类:1.可以有构造方法. 2.可以有抽象方法也可以有具体方法. 3.权限修饰符可以是private.默认.protected.public. 4.可以定义成员变量. 5.interface ...
- [转载]Failed to read session data On PHP 7.1
从php5.6升级php7.1,报错 Warning: session_start(): Failed to read session data: user (path: ) Warning: ses ...
- TS各个表 与 SECTION 的解析 CAS原理
TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...
- GSMM数据库设计小结
边写边结 1.新增,删除,修改在各自的DAL中进行,查,可以新建一个DAL,里面是需要的各个属性,跨表,不同表属性整合成一个对象(集合)返回,输出到用户界面.
- java中如何判断一个字符串是否包含另外一个字符串的方法
indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置: 如果不包含必定全部返回值为-1 package my_automation; public cla ...