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();
}
}

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

  1. 浅谈Spring中的事务回滚

        使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...

  2. Try-Catch包裹的代码异常后,竟然导致了产线事务回滚!

    导读:​一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着 ...

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

    首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLExceptio ...

  4. 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚

    普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚

  5. 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

    一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...

  6. springmvc事务回滚失效

    转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTe ...

  7. [转] C# mysql 事务回滚

    什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...

  8. Spring中@Transactional事务回滚

    转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部 ...

  9. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

随机推荐

  1. encodeURIComponent编码与解码

    问题:JavaScript用encodeURIComponentt编码后无法再后台解码的问题. 目前写法: window.self.location="list.jsp?searchtext ...

  2. python全栈开发笔记---------数据类型-----字典dict

    字典 #dict #1.基本结构 info= { "k1" : "v1", #键值对 "k2" : "v2" } ### ...

  3. Mac配置系统环境变量

    最近在配置flutter的环境变量,使用: export PATH=$PATH:`pwd`/flutter/bin 然后一段时间之后发现环境变量莫名其妙的就消失了,这里有一个大坑! !!!!Mac 系 ...

  4. php解析Excel表格并且导入MySQL数据库

    最近根据客户需求,需要增加一个导入Excel表格的功能,Excel中存放的是知识库中医知识的分类体系目录.是在thinkphp框架下编写的代码,用的是phpexcel第三方包.测试环境用的是xampp ...

  5. 《TypeScript 中文入门教程》

    转载:<TypeScript 中文入门教程> 17.注解 (2015-12-03 11:36) 转载:<TypeScript 中文入门教程> 16.Symbols (2015- ...

  6. JVM虚拟机 YGC和FGC发生的具体场景

    1.YGC和FGC是什么 YGC :对新生代堆进行gc.频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收.性能耗费较小. FGC :全堆范围的gc.默认堆空间使用到达80%(可调整)的时候会 ...

  7. 给a链接跳转后的页面添加class

    $(document).ready(function(){ var test = window.location.href;//获取到当前页面的href // console.log(test); / ...

  8. logback-spring.xml 博客分享

    https://juejin.im/post/5b51f85c5188251af91a7525

  9. cocos2dx自定义事件类封装

    GameEvent.h: #pragma once #include "cocos2d.h" USING_NS_CC; class GameEvent { public: //封装 ...

  10. es6学习日记3

    函数的扩展 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x, y); } ...