In this post, we want to talk about JDBC Transactions and how we can manage the operations in a database.
The most popular DBMS like MySQL and Oracle have by default the option autocommit enabled, it means immediately after any DML Operation saves the changes and makes them visible to all users. To use transactions must set the databse parameter autocommit to false.
The management of the database using transaction allows us to maintain consistency in the data, according to his ‘ACID’ property.
Transaction Properties
What we want with Transactions? To Maintain this four properties:
- Atomicity, it’s simple either all operations in database occur, or nothing occurs.
- Consistency, ensures that the database is in a valid state before and after the transaction.
- Isolation, any transaction is independent of another, and your result doesn’t depends of any other.
- Durability, the result of commit a transaction must persist in a non-volatile memory even if occurs a crash or power loss.
Tools
For this example we use:
- JDK 1.7.0_67 (rt.jar includes java.sql package)
- Mysql-connector-java 5.1.34
- Eclipse Luna
- MySQL Community Server 5.6.22
1. Example:
DBConnection.java:
01 |
package com.javacodegeeks.jdbc.transactions; |
03 |
import java.sql.Connection; |
04 |
import java.sql.DriverManager; |
05 |
import java.sql.SQLException; |
08 |
* @author Andres.Cespedes |
11 |
public class DBConnection { |
14 |
private static String DB_USER = "admin"; |
15 |
private static String DB_PASSWORD = "admin"; |
17 |
public static Connection getConnection() throws SQLException { |
18 |
Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); |
We use DBConnection only to get the connection, any other operation is handled in the main class.
DBTransaction.java:
01 |
package com.javacodegeeks.jdbc.transactions; |
03 |
import java.sql.Connection; |
04 |
import java.sql.PreparedStatement; |
05 |
import java.sql.SQLException; |
08 |
* @author Andres.Cespedes |
11 |
public class DBTransaction { |
13 |
private static String INSERT = "INSERT INTO test.department (idDepartment, name) VALUES (?, ?)"; |
18 |
public static void main(String[] args) { |
19 |
Connection connection = null; |
20 |
PreparedStatement pstmt = null; |
21 |
PreparedStatement pstmt2 = null; |
23 |
connection = DBConnection.getConnection(); |
24 |
} catch (SQLException e) { |
25 |
System.err.println("There was an error getting the connection"); |
28 |
connection.setAutoCommit(false); |
29 |
System.err.println("The autocommit was disabled!"); |
30 |
} catch (SQLException e) { |
31 |
System.err.println("There was an error disabling autocommit"); |
33 |
// Starts JDBC Transaction |
35 |
pstmt = connection.prepareStatement(INSERT); |
36 |
pstmt2 = connection.prepareStatement(INSERT); |
39 |
pstmt.setString(2, "Madrid"); |
43 |
pstmt2.setString(2, "Galicia"); |
47 |
System.err.println("The transaction was successfully executed"); |
48 |
} catch (SQLException e) { |
50 |
//We rollback the transaction, atomicity! |
51 |
connection.rollback(); |
52 |
System.err.println(e.getMessage()); |
53 |
System.err.println("The transaction was rollback"); |
54 |
} catch (SQLException e1) { |
55 |
System.err.println("There was an error making a rollback"); |
The connection.commit() applies all the changes before him. The key is to disable the autocommit and to group the sentences to to manage them in a transaction with a final commit.
We try to execute the transaction and this was the result.
1 |
The connection is successfully obtained |
2 |
The autocommit was disabled! |
3 |
The transaction was successfully executed |
Here we should note that if one of the operations does not run correctly, all entries aren’t made and the database remains unchanged.
DBSavePoint.java:
01 |
package com.javacodegeeks.jdbc.transactions; |
03 |
import java.sql.Connection; |
04 |
import java.sql.PreparedStatement; |
05 |
import java.sql.SQLException; |
06 |
import java.sql.Savepoint; |
09 |
* @author Andres.Cespedes |
12 |
public class DBSavePoint { |
14 |
private static String INSERT = "INSERT INTO test.department (idDepartment, name) VALUES (?, ?)"; |
16 |
public static void insertRow(Connection conn, int idRow, String contentRow) |
18 |
PreparedStatement pstmt = null; |
19 |
pstmt = conn.prepareStatement(INSERT); |
20 |
pstmt.setInt(1, idRow); |
21 |
pstmt.setString(2, contentRow); |
29 |
public static void main(String[] args) { |
30 |
Connection connection = null; |
31 |
Savepoint savepoint = null; |
33 |
connection = DBConnection.getConnection(); |
34 |
} catch (SQLException e) { |
35 |
System.err.println("There was an error getting the connection"); |
38 |
connection.setAutoCommit(false); |
39 |
System.err.println("The autocommit was disabled!"); |
40 |
} catch (SQLException e) { |
41 |
System.err.println("There was an error disabling autocommit"); |
43 |
// Starts JDBC Transaction |
45 |
insertRow(connection, 1, "Madrid"); |
46 |
insertRow(connection, 2, "Eibar"); |
47 |
savepoint = connection.setSavepoint("SavePoint1"); |
48 |
insertRow(connection, 3, "Galicia"); |
51 |
System.err.println("The transaction was successfully executed"); |
52 |
} catch (SQLException e) { |
54 |
// We rollback the transaction, to the last SavePoint! |
55 |
connection.rollback(savepoint); |
56 |
System.err.println(e.getMessage()); |
58 |
.println("The transaction was rollback to the last savepoint"); |
59 |
} catch (SQLException e1) { |
60 |
System.err.println("There was an error making a rollback"); |
The method setSavepoint of class Connection allows to create a checkpoint internally in the transaction, and if a error occurs we can back to the savepoint with all of changes made before.
2. Summary
Here we tried to understand how to manage the JDBC Operations through transactions and how to make check points by means ofSavePoint class.
http://examples.javacodegeeks.com/core-java/sql/jdbc-transaction-management-example/
- spring Transaction Management --官方
原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12. ...
- Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)
简介 Spring.NET为事务管理提供了一个持久化抽象(consistent abstraction ),其优点如下: 为不同事务API,例如ADO.NET,Enterprise Services, ...
- Could not roll back JDBC transaction途径
[异常]接口数量:DM02;错误代码:ERR_EAI_02_014; 错误叙述性说明:当将中间库异常Could not roll back JDBC transaction; nested excep ...
- Java Transaction Management
Just a few weeks ago, I had a discussion with one of my colleagues about how to manage the transacti ...
- Cisco IOS basic system management command reference
absolute : to specify an absolute time for a time-range (in time-range configuration mode) no absolu ...
- JDBC Tutorials: Commit or Rollback transaction in finally block
http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...
- Spring Boot Reference Guide
Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, ...
- 翻译:Spring-Framework-Reference Document:11-Transaction Management
TUESDAY, 07 APRIL Comprehensive transaction support is the most compelling reasons to use the Spring ...
- CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)
JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...
随机推荐
- BZOJ 1629: [Usaco2007 Demo]Cow Acrobats
Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...
- OSAL多任务资源分配机制
转自OSAL多任务资源分配机制 一.概述 OSAL (Operating System Abstraction Layer),翻译为"操作系统抽象层". 个应用程序对象. ...
- Delphi组件indy 10中IdTCPServer修正及SSL使用心得
indy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰.Indy ...
- Android Training精要(六)如何防止Bitmap对象出现OOM
1.使用AsyncTask異步加載bitmap圖片避免OOM: class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> ...
- Hadoop开发环境搭建
hadoop是一个分布式系统基础架构,由Apache基金会所开发. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储. Hadoop实现了一个分布式文件系统 ...
- pcDuino汉化方法
1,打开终端:2,在终端输入命令 sudo apt-get update 更新一下软件源3, 输入命令下载中文支持包 sudo apt-get install language-pack-gnome- ...
- POJ_1182_食物链_[NOI]_(并查集)
描述 http://poj.org/problem?id=1182 共A,B,C三种动物,A吃B,B吃C,C吃A.给出询问 q : t , x , y , 表示: x 与 y 是同类 ( t==1 ...
- DevExpress之lookupedit
DevExpress中的lookupedit的使用方法. 绑定数据源: lookupedit.properties.valuemember = 实际要用的字段; //相当于editvalu ...
- Java for selenium(webdriver) 环境搭建
开发环境 1. jdk1.7 2. Eclipse 3. selenium(selenium-java-2.42.2.zip) 将下载下来的 selenium-java-2.42.2.zip 解压, ...
- SQLServer使用规范(转载)
SQLServer使用规范 常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自 ...