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:

  1. JDK 1.7.0_67 (rt.jar includes java.sql package)
  2. Mysql-connector-java 5.1.34
  3. Eclipse Luna
  4. MySQL Community Server 5.6.22

1. Example:

DBConnection.java:

01 package com.javacodegeeks.jdbc.transactions;
02  
03 import java.sql.Connection;
04 import java.sql.DriverManager;
05 import java.sql.SQLException;
06  
07 /**
08  * @author Andres.Cespedes
09  *
10  */
11 public class DBConnection {
12  
13     private static String DB_URL = "jdbc:mysql://localhost:3307/test";
14     private static String DB_USER = "admin";
15     private static String DB_PASSWORD = "admin";
16  
17     public static Connection getConnection() throws SQLException {
18         Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
19         return connection;
20     }
21 }

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;
02  
03 import java.sql.Connection;
04 import java.sql.PreparedStatement;
05 import java.sql.SQLException;
06  
07 /**
08  * @author Andres.Cespedes
09  *
10  */
11 public class DBTransaction {
12  
13     private static String INSERT = "INSERT INTO test.department (idDepartment, name) VALUES (?, ?)";
14  
15     /**
16      * @param args
17      */
18     public static void main(String[] args) {
19         Connection connection = null;
20         PreparedStatement pstmt = null;
21         PreparedStatement pstmt2 = null;
22         try {
23             connection = DBConnection.getConnection();
24         catch (SQLException e) {
25             System.err.println("There was an error getting the connection");
26         }
27         try {
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");
32         }
33         // Starts JDBC Transaction
34         try {
35             pstmt = connection.prepareStatement(INSERT);
36             pstmt2 = connection.prepareStatement(INSERT);
37              
38             pstmt.setInt(11);
39             pstmt.setString(2"Madrid");
40             pstmt.execute();
41              
42             pstmt2.setInt(12);
43             pstmt2.setString(2"Galicia");
44             pstmt2.execute();
45              
46             connection.commit();
47             System.err.println("The transaction was successfully executed");
48         catch (SQLException e) {
49             try {
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");
56             }
57         }
58     }
59 }

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;
02  
03 import java.sql.Connection;
04 import java.sql.PreparedStatement;
05 import java.sql.SQLException;
06 import java.sql.Savepoint;
07  
08 /**
09  * @author Andres.Cespedes
10  *
11  */
12 public class DBSavePoint {
13  
14     private static String INSERT = "INSERT INTO test.department (idDepartment, name) VALUES (?, ?)";
15  
16     public static void insertRow(Connection conn, int idRow, String contentRow)
17             throws SQLException {
18         PreparedStatement pstmt = null;
19         pstmt = conn.prepareStatement(INSERT);
20         pstmt.setInt(1, idRow);
21         pstmt.setString(2, contentRow);
22         pstmt.execute();
23         pstmt.close();
24     }
25  
26     /**
27      * @param args
28      */
29     public static void main(String[] args) {
30         Connection connection = null;
31         Savepoint savepoint = null;
32         try {
33             connection = DBConnection.getConnection();
34         catch (SQLException e) {
35             System.err.println("There was an error getting the connection");
36         }
37         try {
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");
42         }
43         // Starts JDBC Transaction
44         try {
45             insertRow(connection, 1"Madrid");
46             insertRow(connection, 2"Eibar");
47             savepoint = connection.setSavepoint("SavePoint1");
48             insertRow(connection, 3"Galicia");
49  
50             connection.commit();
51             System.err.println("The transaction was successfully executed");
52         catch (SQLException e) {
53             try {
54                 // We rollback the transaction, to the last SavePoint!
55                 connection.rollback(savepoint);
56                 System.err.println(e.getMessage());
57                 System.err
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");
61             }
62         }
63     }
64  
65 }

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/

JDBC Transaction Management Example---reference的更多相关文章

  1. spring Transaction Management --官方

    原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12.  ...

  2. Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)

    简介 Spring.NET为事务管理提供了一个持久化抽象(consistent abstraction ),其优点如下: 为不同事务API,例如ADO.NET,Enterprise Services, ...

  3. Could not roll back JDBC transaction途径

    [异常]接口数量:DM02;错误代码:ERR_EAI_02_014; 错误叙述性说明:当将中间库异常Could not roll back JDBC transaction; nested excep ...

  4. Java Transaction Management

    Just a few weeks ago, I had a discussion with one of my colleagues about how to manage the transacti ...

  5. Cisco IOS basic system management command reference

    absolute : to specify an absolute time for a time-range (in time-range configuration mode) no absolu ...

  6. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  7. Spring Boot Reference Guide

    Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch,  ...

  8. 翻译:Spring-Framework-Reference Document:11-Transaction Management

    TUESDAY, 07 APRIL Comprehensive transaction support is the most compelling reasons to use the Spring ...

  9. CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

    JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...

随机推荐

  1. BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐

    Description The cows are having a picnic! Each of Farmer John's K (1 <= K <= 100) cows is graz ...

  2. 听同事讲 Bayesian statistics: Part 2 - Bayesian inference

    听同事讲 Bayesian statistics: Part 2 - Bayesian inference 摘要:每天坐地铁上班是一件很辛苦的事,需要早起不说,如果早上开会又赶上地铁晚点,更是让人火烧 ...

  3. redis pub/sub 发布订阅

    Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列.(参考:http://www.cn ...

  4. jQueryEasyUI中DataGrid的height,width,fit,fitColumns属性

    height: 600, //不指定则默认垂直包裹,指定了则固定 width:1200,//不指定则水平100%平铺,指定了则固定 fit:false,//true:高度填充父窗体,忽略height属 ...

  5. android发送/接收Json包含中文的处理

    转自:http://wiki.neal365.com/2013/02/25/android%E5%8F%91%E9%80%81%E6%8E%A5%E6%94%B6json%E5%8C%85%E5%90 ...

  6. Xmanager Enterprise 4 使用说明

    Xmanager Enterprise 4 使用说明 安装Xmanager Enterprise 4操作步骤比较简单,下一步即可完成. Xbrowser 使用xdcmp 协议通过图形化桌面远程连接到l ...

  7. oracle core 概述

    oracle数据库系统的架构及其复杂,其提供的特性也非常的多.作为一种关系型数据库,oracle提供的基本特性: transaction concurrency read consistent 而支撑 ...

  8. POJ_3176_Cow_Bowling_(数字三角形)_(动态规划)

    描述 http://poj.org/problem?id=3176 给出一个三角形,每个点可以走到它下面两个点,将所有经过的点的值加起来,问最大的和是多少. Cow Bowling Time Limi ...

  9. wps操作记录

    WPS Excel 1.点击插入---形状:画好方框,选中后右键“编辑文字”,在方框中加入你需要的文字信息 2.点击插入---形状:画出连接线,按住SHIFT拖动可以水平或垂直的直线 3.调整位置.选 ...

  10. 进程与线程(二) java进程的内存模型

    从我出生那天起,我就知道我有个兄弟,他桀骜不驯,但实力强悍 ,人家都叫它C+++            ----java 上回说到了,C进程的内存分配,那么一个java运行过程也是一个进程,java内 ...