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 ...
随机推荐
- the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header
the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...
- 【2011 Greater New York Regional 】Problem G: Rancher's Gift
计算几何的题目,很简单: 自己随手敲了个,纪念下! #include<cstdio> #include<cmath> using namespace std; struct p ...
- tornado异步请求的理解(转)
tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...
- java.math.BigInteger使用心得总结(转)
今天参考课本写了一个关于二进制与十进制转换的程序,程序算法不难,但写完后测试发现不论是二转十还是十转二,对于大于21亿即超过整数范围的数不能很好的转换.都会变成0.参考书籍发现使用使用BigInteg ...
- how to uninstall devkit
http://www.uninstallapp.com/article/How-to-uninstall-Perl-Dev-Kit-PDK-8.0.1.289861.html PerfectUnins ...
- C 语言字符串(译)
C 语言的 switch 语句非常强大.然而,它不能用字符串作为判断条件,只能用常整数.这是可以理解的,因为 C 的字符串仅仅是数组,它们并不是并不是一个整体. 在某些情况下,将 string 作为 ...
- WC2015 滚粗记
Day 0 和南师附中诸人去杭州,想到这是第三次去杭州有点感动 想到noi还要在杭州,简直…… 火车站接送好评如潮 ym大学军,到学军领资料然后到浙大宿舍安顿,noi的书包还是挺不错的 看起来宿舍还可 ...
- Away3d 基础 1 ---对一个简单类的解释
转自:http://www.cnblogs.com/nooon/archive/2009/05/16/1458334.html 原英文地址: http://www.flashmagazine.com/ ...
- 64位windows7 上安装32位oracle 10g 的方法
操作系统: windows7 中文旗舰版 oracle安装版本: 10.2.0.1 中文版,升级补丁至 10.2.0.3 下面说正题首先,我们要解除oracle安装的windows版本检测1.编辑安装 ...
- 奇怪的JS正则之 /[A-z]/.test("\\"); // true
本文是在一个国外介绍JS的网站上转载过来的,作者很逗,先是举例JS让人XX的例子,再动手实践发现JS隐藏的黑知识.为什么 /[A-z]/.test("\\"); 是 true ,你 ...