回滚的意义---JDBC事务回滚探究
JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后:
try{
conn.setAutoCommit(false);
ps.executeUpdate();
ps.executeUpdate();
conn.commit();
}catch(Exception e){
conn.rollback();
}
但是,这种回滚是没有意义的:
一旦commit前出错, 就不提交了, 回滚无用
一旦commit了, 说明没错, 不用回滚
找到一篇和我观点相同的文章:
我以为无需回滚,即使真要回滚,需要将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事务回滚探究的更多相关文章
- 浅谈Spring中的事务回滚
使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...
- Try-Catch包裹的代码异常后,竟然导致了产线事务回滚!
导读:一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着 ...
- JDBC事务和数据库事务嵌套的讨论 .
首先必须执行con.setAutoCommit(false)方法,将JDBC事务设置为手动提交,否则手动提交con.commit()无效,手动回滚con.rollback()引发SQLExceptio ...
- 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
- springmvc事务回滚失效
转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTe ...
- [转] C# mysql 事务回滚
什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...
- Spring中@Transactional事务回滚
转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部 ...
- 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)
事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...
随机推荐
- python笔记二
一 运算符 1算术运算+ - * / % ** //其中%为取余,**为取幂如2**10=1024 9//4=2 需要注意的是python2.7中如9/2=4 需要正确表示,则在开头添加 fr ...
- linux c使用socket进行http 通信,并接收任意大小的http响应(三)
使用socket进行http通信的时候,浏览器返回的响应经常不是固定长度的,有时候很大,有些时候又非常小,十分讨厌.如果仅仅只是为了接收一小段信息,设置一个十分大的缓存,这样又会十分浪费.而且经常更改 ...
- python的出生
1.语言的种类 机器语言------>汇编语言------>高级语言 高级语言按转换方式分为两类: 解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器 ...
- [Codeforces778E]Selling Numbers
Problem 给一个由问号和数字组成的数字串A(问号表示任一数字). 再给定n个数字Bi,和0~9的数字的价值. F(x)表示x各个位数上的价值和.问A为何值时,sum(F(Bi+A))的值最大为多 ...
- python非技术性问题整理
针对软件安装包,安装时出现下类问题, 解决方法时, 以管理员身份运行命令行, 可以看到,包 正常安装. 在使用bs4,分析html或者xml文档时, 代码无法识别lxml 指令, 可能是python ...
- effective java——12考虑实现coparable接口
float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该 ...
- 剑指Offer 52. 正则表达式匹配 (字符串)
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- ChIP-seq motif ROC 相关资料
[怪毛匠子]独家整理 不可以转载 MEME工具 http://meme-suite.org DNA motif 搜索算法总结 http://www.bbioo.com/lifesciences/40- ...
- 安卓开发学习之AutoCompleteTextView
最近在学习安卓开发,开始是看视频学的,基本上是照着老师的操作来,但其实老师也是按照安卓的开发文档来教的,于是决定试试自己看文档来学. 今天学到AutoCompleteTextView,一上来先按照Li ...
- SQL-存储过程-010
什么是存储过程? 可以理解为数据库中的方法,与C#中的方法一样,具有参数和返回值: 存储过程的优点? 提高运行速度:存储过程在创造是进行编译,以后运行存储过程都不需要再进行编译,极大化的提高了数据库的 ...