关于jdbc事务自动提交

原创 2015年07月10日 22:39:36

实现jdbc事务流程:

  1. 建立数据库连接;
  2. 将autoCommit设置为false;
  3. 执行sql语句;
  4. 提交;
  5. 处理异常,如果sql语句执行失败则执行rollBack;

其中,如果执行sql语句过程中抛出异常,不调用commit,提交不会发生,但如果最后执行setAutoCommit(true),提交还是有可能发生。rollback必须显式调用,即便发生异常,执行到setAutoCommit(true)时,提交会自动进行,事务可能执行一一部分。
典型示例如下:

import java.sql.*;
public class TestTranslation {
    public static void main(String args[])
    {
        Statement stmt=null;
        Connection conn=null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost/javatest?user=cheng&password=***");
            conn.setAutoCommit(false);
            String sqlLine1="update tbl_currency set currency=currency-200,last_modified=current_timestamp WHERE account='A' and currency>=200";
                st=conn.createStatement();
                int r1=st.executeUpdate(sqlLine1);
                String sqlLine2="update tbl_currency set currency=currency+200,last_modified=current_timestamp WHERE account='B'";
                int r2=st.executeUpdate(sqlLine2);
                if(r1==1&&r2==1){
                    conn.commit();
                    System.out.println("A2B转账成功");
                }
                else{
                    //conn.rollback();
                    System.out.println("A2B转账失败");
                }
        }
        catch(ClassNotFoundException e){
            System.out.println("class not found");
        }
        catch(SQLException e){
            System.out.println("SQL exception");
            e.printStackTrace();
        }
        finally{
            if(null!=conn){
                try{
                    conn.setAutoCommit(true);
                    conn.close();
                }
                catch(SQLException e){
                    System.out.println("close sql connection failed");
                }
            }
            if(null!=stmt){
                try{
                    stmt.close();
                }
                catch(SQLException e){
                    System.out.println("close statement failed");
                }
            }
        }
    }
}

这段代码是一个银行账户问题,即将A中的钱转入200到B账户中,其中有个条件,如果A账户余额小于200则不进行转账,最后对结果进行检查。如果A账户中的钱小于200,第一条语句返回0,进入转账失败流程,但不会抛出异常,如果注释掉conn.rollBack(),当执行到finally中的conn.setAutoCommit(true)时,这两条语句还是会被commit,最终的结果就是其中尽管A中的钱不再减少,但B中的钱还是会增加,所以,在这种情形下,显式调用rollBack是必需的。
下面的代码,还是被因为调用setAutoCommit而提交。

import java.sql.*;
public class TestTranslation {
    /**
     * @param args
     */
    public static void main(String args[])
    {
        Statement stmt=null;
        Connection conn=null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql://localhost/test?user=cheng");
            conn.setAutoCommit(false);
            stmt=conn.createStatement();
            stmt.executeUpdate("insert into tbl_test values('liyi',26,'female')");
            stmt.executeUpdate("insert into tbl_test values('liyi',26,'female')");
            conn.commit();
        }
        catch(ClassNotFoundException e){
            System.out.println("class not found");
        }
        catch(SQLException e){
            try {
                conn.rollback();//如果这里没有rollback,执行到finally中的setAutoCommit时,执行成功的前一句依然会被提交
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            System.out.println("SQL exception");
            e.printStackTrace();
        }
        finally{
            if(null!=conn){
                try{
                    conn.setAutoCommit(true);
                    conn.close();
                }
                catch(SQLException e){
                    System.out.println("close sql connection failed");
                }
            }
            if(null!=stmt){
                try{
                    stmt.close();
                }
                catch(SQLException e){
                    System.out.println("close statement failed");
                }
            }
        }
    }
}

其中名字是主键,第二句在第一句执行后显然应该失败,抛出异常,如果异常处理中没有rollback,执行到finally中的setAutoCommit时还是会提交第一句。
所以,尽管有异常,如果不显式调用rollback,事务还是可能执行一部分。

jdbc,oracle使用事务提交处理

如果在SQL中需要同时执行多个SQL语句,而且其中任意一个SQL执行失败其他执行过的都撤销,就需要用到事务,jdbc,Oracle中使用事务是如下方式。Connection conn=DriverMa...
  • cn_bboy
  • cn_bboy
  • 2012年08月16日 20:05
  • 1172

Android开发工程师必看笔试题:Java基础选择题(一)

1.在Java中,( )类提供定位本地文件系统,对文件或目录及其属性进行基本操作。(单选)   A) FileInputStream   B) FileReader   C) FileWrite...
  • TaooLee
  • TaooLee
  • 2015年10月27日 08:41
  • 3606

事务的手动提交 jdbc Template

在web.xml 中配置实现接口ApplicationContextAware 的 ApplicationContextUtil 的类,可以获取项目运行的WebApplicationContextDa...
  • Cheat1173010256
  • Cheat1173010256
  • 2016年09月07日 23:59
  • 1014

JDBC自动提交和批处理操作

今天用JDBC与数据库进行交互的时候,报错如下: **************************************************************************...
  • H12KJGJ
  • H12KJGJ
  • 2017年02月12日 18:02
  • 1265

jdbc事物提交,回滚不起作用的解决方案

今天在写程序的时候发现一个奇怪的问题: 明明设置了事物非自动提交,但是当 回滚后,更新操作还是被执行了,并且不报任何错误. 下面是代码,代码是没有问题的: import java.sq...
  • lidew521
  • lidew521
  • 2016年11月16日 22:48
  • 1697

jdbc控制自动提交功能

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java...
  • tengdazhang770960436
  • tengdazhang770960436
  • 2011年12月11日 20:02
  • 2210

JDBC的autoCommit为true时,其事务管理测试

jdbc autoCommit 存储过程调用
  • LeonWang_Fly
  • LeonWang_Fly
  • 2015年12月04日 18:32
  • 2020

JDBC 关闭数据库连接与自动提交

//!!!!!!!!!!!jdbc关闭数据库连接时,会隐含一个提交事务的操作!!!!!!!!!!惊恐
  • hjiacheng
  • hjiacheng
  • 2016年11月17日 00:13
  • 3413

Spring事务之七(事务自动提交)

更多文章:http://zhuqiuhui.space/ 一、MySQL数据库事务自动提交     对于mysql数据库,默认情况下,数据库处于自动提交模式。每一条语句处于一个单独的事...
  • zhuqiuhui
  • zhuqiuhui
  • 2017年04月21日 00:45
  • 3888

[疯狂Java]JDBC:事务管理、中间点、批量更新

1. 数据库事务的概念:     1) 事务的目的就是为了保证数据库中数据的完整性;     2) 设想一个银行转账的过程,如果分两步,第一步是A的账户-1000,第二步是B的账户+1000,这两个动...
  • Lirx_Tech
  • Lirx_Tech
  • 2016年04月17日 15:44
  • 1773
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于jdbc事务自动提交
举报原因:
原因补充:

(最多只允许输入30个字)