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 ...
随机推荐
- WordPress 前端投稿/编辑插件 DJD Site Post(支持游客和已注册用户)
转自:http://www.wpdaxue.com/front-end-publishing.html 说到前端用户投稿,倡萌之前推荐过3个不错的插件: WordPress匿名投稿插件:DX-Cont ...
- redis基本命令的演示:
import redis r = redis.Redis(host='127.0.0.1', port=6379,db = 0) #查看匹配redis的数据 r.keys() #查看redis的大小 ...
- 想学ps的,这全是精华,拿走不谢!!!
- OneAPM Cloud Test——系统性能监控神器
2015 年 8 月,OneAPM 推出了一款系统性能监控产品--Cloud Test,产品上线以来以「两低一高」的特点迅速成为市场增长率最快的一匹黑马.「两低一高」,即低使用成本.低学习成本以及高服 ...
- ANDROID_MARS学习笔记_S05_002_给传感器注册listener
1 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); se ...
- 带文字的ImageButton[自定义]
今天Android项目中遇到一个ImageButton控件上面要显示文字,无奈自定义了一个ImageButton,继承自ImageButton.其实就是override这个控件的onDraw(Canv ...
- redis pub/sub 发布订阅
Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列.(参考:http://www.cn ...
- IT传道解惑:心累了就读读
写在开始 学习不是因为缺少时间而是缺少努力 Studies this matter, lacks the time, but is lacks diligently. 只要你想学好,用心去学,肯下功夫 ...
- spring-data-redis --简单的用spring-data-redis
spring-data-redis序列化策略 spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷.sdr提供了4种内置的seriali ...
- 替换SQL Server字段中的换行符,回车符
replace(string_expression , string_pattern , string_replacement) 第一个参数:要查找的字段. 第二个参数:要查找的字符. 第三个参数:要 ...