回滚的意义---JDBC事务回滚探究

JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后:

try{
   conn.setAutoCommit(false);
  ps.executeUpdate();

  ps.executeUpdate();

  conn.commit();

}catch(Exception e){
      conn.rollback();
}

但是,这种回滚是没有意义的:

一旦commit前出错,  就不提交了,  回滚无用

一旦commit了,    说明没错,   不用回滚

找到一篇和我观点相同的文章:

<JDBC 事务的回滚 提交>

我以为无需回滚,即使真要回滚,需要将commit写在主要业务的try...catch之后,一旦主要业务中途出错,回滚.

表:JDBC事务3种写法回滚比较

import java.sql.*;

public class TestJDBC {

    public static final String URL = "jdbc:mysql://127.0.0.1/test";
    public static final String USER_NAME = "root";
    public static final String USER_PWD = "root";

    private static Connection conn = null;
    private static PreparedStatement ps;

    private static void connOpen() throws SQLException {
        conn = DriverManager.getConnection(URL, USER_NAME, USER_PWD);
    }

    private static void connClose() throws SQLException {
        if (ps != null) {
            ps.close();
            ps = null;
        }
        if (conn != null) {
            conn.close();
            conn = null;
        }
    }

    private static void testRollBack() throws SQLException {
        connOpen();
        try {

            conn.setAutoCommit(false);

            String strSQL = "INSERT INTO customer(uname,pwd) VALUES(?,‘1‘)";
            ps = conn.prepareStatement(strSQL);

            // 插入一条数据
            ps.setString(1, "悟空");
            ps.executeUpdate();

            // 出异常
            if (true) {
                throw new SQLException();
            }

            // 再插入一条数据
            ps.setString(1, "八戒");
            ps.executeUpdate();

            // conn.commit();
        } catch (Exception e) {
            System.out.println("异常!");
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        try {
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        connClose();

    }

    private static void selectAll() throws SQLException {
        connOpen();
        ps = conn.prepareStatement("select * from customer");
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            System.out.print(rs.getString(2) + " : ");
            System.out.println(rs.getString(1));
        }
        connClose();
    }

    public static void main(String[] args) throws SQLException {
        testRollBack();
        selectAll();
    }
}
时间: 2024-12-10 07:13:49

回滚的意义---JDBC事务回滚探究的相关文章

JDBC 事务回滚

package jdbcstu; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TransactionTest { public static void main(String[] args) { Connection conn=null; try { conn=getConnectio

jdbc事务回滚

http://yangzg216.iteye.com/blog/1186085 注意是同一个Statement对象 首先得清楚什么时候使用事务.    当你需要一次执行多条SQL语句时,可以使用事务.通俗一点说,就是,如果这几条SQL语句全部执行成功,则才对数据库进行一次更新,如果有一条SQL语句执行失败,则这几条SQL语句全部不进行执行,这个时候需要用到事务.    其次才是事务的具体使用.    1.获取对数据库的连接(代码这里省略了吧,网上太多了,对各种数据库的连接的都有)    2.设置

thinkphp curd的事务回滚 一看就会

/** *thinkphp数据库的事务回滚例子 *这一般用在多表操作,比如: (1)订单表和其他订单关联信息,删除订单同时也要把订单关联表中的信息删掉,如果说删除了订单表结果在删除订单关联信息表时出现问题,也就是说,订单的关联信息没有删掉,这时就会出现信息不对应,甚至信息的冗余,这时采用事务回滚,如果一个没有删掉,之前的也要回滚,保持记录的对应统一 (2)银行打钱,如果A给B打钱,给Binsert成功了,但是Adelete失败,这时银行就亏大了,明白?此时就要回滚,如果两者其中一者不成立,则都复

JDBC事务和数据库事务嵌套的讨论 .

首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLException:AutoCommit 模式设置为“true”时,无法调用回滚操作. 我们执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,然后分9种情况讨论JDBC事务和数据库事务. 描述:存储过程里面有一条INSERT语句在数据库事务管理下,而另一条INSERT语句在JD

配置Spring JDBC的事务回滚失效

今天配置Mysql DBCP连接池事务回滚失效,竟然浪费了我一下午的时间去调研,问了好多人也都没发现,最后还得靠自己,总结问题如下: 1.Mysql数据库用的是MyISAM表结构而非InnerDB(浪费了两个小时) 2.网上说的默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) . 3.配置DBC

springmvc事务回滚失效

转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTemplate.搭框架时,发现了一个事务无法正常回滚的问题,记录如下: 首先展示问题: Spring applicationContext.xml配置: [html] view plaincopy <bean id="dataSource" class="org.spring

好记性不如烂笔头25-JAVA处理数据库事务(3) - 事务回滚点

在具体的工作中,有的事情需要被保持,不需要回滚,有的工作需要回滚,而这些逻辑,可以通过手动设置事务的回滚点. 1.用JAVA处理数据库事务的事务回滚点的准备 要有一个能够访问数据库的应用.下面的示例都基于ORACLE进行. create table ffm_account( id int primary key , name varchar(32), money int ); 测试数据: insert into ffm_account(id,name,money)values(1,'A',100

ssh事务回滚,纪念这几个月困扰已久的心酸

以前的事务采用的是JTA,xml注入的方式.本人就着开发要优雅合理利用轮子的态度,一直不满意JTA式的申明和切入方式. spring的注解方式多优雅,可是万恶的直到项目快要上线时终于找到了注解式不能回滚的缘由. Spring的事务回滚,当且仅当捕获到RuntimeException类型异常时,才会回滚,对普通Exception异常无效. 满满一把心酸泪,,, 原理:代码贴上: 配置可参考如下:http://blog.csdn.net/greensurfer/article/details/752

Entity Framework实现事务回滚

在使用Entity Framework为主从表添加数据,当一个表添加数据成功,另一个表添加数据失败,这时候就需要用到事务回滚. 比如有以下关系的2张表. 客户端使用TransactionScope类可以实现事务回滚. class Program { static void Main(string[] args) { try { using (TransactionScope ts = new TransactionScope()) { using (CountryDetailsEntities