JDBC批处理---(java 对数据库的回滚) .
1先看一下程序:
package com.redking.jdbc.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo07 {
public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
public static final String DBURL = "jdbc:odbc:testDB" ;
public static void main(String[] args) {
Connection conn = null ;
Statement pstmt = null ;
try {
// 向JAVA容器中加载驱动
Class.forName(DBDRIVER) ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(DBURL) ;
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt = conn.createStatement() ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;
} catch (SQLException e) {
e.printStackTrace();
}
//现在执行数据库的更新操作
try {
pstmt.executeBatch() ;
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果发现:程序报错,原因是第四条数据有问题,前面三条插进去了。
现在所有的代码确实都加入到批处理中了,但是却有点不妥当,因为在出错之前的语句都正确执行了,而出错之后的代码没有执行。应该是如果有一个出错了,则全部应该停止执行。
也就是说我们现在的程序缺少了一个事务的处理。
事务处理之前必须进行取消自动提交,在默认情况下,所有的数据都是被默认提交上去的,就是说只要一执行更新就提交。
取消自动提交之后,如果最后程序的代码(批处理代码)没有出错,则可以进行人为的手工提交。最后如果程序出现了错误,则应该进行回滚。
完善代码:
package com.redking.jdbc.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo07 {
public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
public static final String DBURL = "jdbc:odbc:testDB" ;
public static void main(String[] args) {
Connection conn = null ;
Statement pstmt = null ;
try {
// 向JAVA容器中加载驱动
Class.forName(DBDRIVER) ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(DBURL) ;
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt = conn.createStatement() ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;
pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;
} catch (SQLException e) {
e.printStackTrace();
}
//取消自动提交
try {
conn.setAutoCommit(false);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//现在执行数据库的更新操作
try {
pstmt.executeBatch() ;
//如果没有错误,则表示可以向下执行
//手工提交
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
//如果出错了,则应该把数据回滚
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
try {
pstmt.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
就发现程序出错,全部没有插进去。
JDBC批处理---(java 对数据库的回滚) .的更多相关文章
- 复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等
使用配置文件properties进行连接数据库 首先创建一个file自定义文件名,但是后缀名必须改为.properties(不分大小写):如config.properties: 然后双击config. ...
- JAVA数据库操作回滚小结
一:总结的原因 在最近的工作中,遇到了一个一对多关系多表数据传输,传送成功状态绑定在主数据表上,因为代码不健壮问题造成了主表传送状态更新失败,而子表数据就被重复插入.又由于数据传输频率很高,我们的测试 ...
- MySQL数据库的回滚失败(JAVA)
这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...
- JDBC 数据库连接 Java操作数据库 jdbc快速入门
JDBC基本概念 Java DataBase Connectivity 数据库连接 java操作数据库 本质上(sun公司的程序员)定义的一套操作关系型数据库的规则 既接口 更新内容之前 代码 pa ...
- ThinkPHP 实现数据库事务回滚示例代码
ThinkPHP提供了数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法: 启动事务: $User->startTrans(); 提交事务: $User->commit( ...
- 记一次腾讯云MySQL数据库数据回滚
如题,因为操作人员的问题,需要对数据库数据进行回滚. 可以看到,设置了7天自动备份,且是物理冷备. 什么是物理冷备?科普一下: (1)热备:在数据库运行时,直接进行备份,对运行的数据库没有影响.(2) ...
- MSSQL Server Transaction 数据库事务回滚的用法
使用的表结构如下: Commit TransAction Else Rollback TransAction/* 自定义一个变量来判断最后是否发生过错误.*/ ...
- @transactional注解,报错后数据库操作回滚失败
1. https://jingyan.baidu.com/article/3a2f7c2e27d51b26afd611ff.html 2. https://blog.csdn.net/lee_star ...
- JDBC核心技术(获取数据库链接、数据库事务、数据库链接池)
@ 目录 前言 数据的持久化 Java数据存储技术 JDBC介绍 JDBC体系结构 获取数据库链接 Driver接口 加载注册JDBC驱动 获取数据库链接 数据库链接方式(实例) 方式一:代码中显示出 ...
随机推荐
- Arrays.asList的使用及异常问题
将数组转成List问题,通常我们习惯这样写成:List<String> list = Arrays.asList("1","2"); 于是我们这样就 ...
- db2查看表空间
select substr(tbsp_name,1,20) as 表空间名称,substr(tbsp_content_type,1,10) as 表空间类型,sum(tbsp_total_size_k ...
- CustomEditor 自定义预览窗
using UnityEngine; using System.Collections; public class MyTextureView : MonoBehaviour { public Tex ...
- I/O空间映射
转自:http://www.cnblogs.com/hydah/archive/2012/04/10/2232117.html 注:部分资料和图片来源于网络,本文在学习过程中对网络资源进行再整理. I ...
- 深入理解ThreadLocal(一)
Android里,在不同的线程(假设子线程已经创建了Looper)中创建Handler时,并不需要显式指定Looper,系统能自动找到该线程自己的Looper.不同线程的Looper相互独立,之所以能 ...
- 内存管理、ARC
内存管理 一.基本原理 1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一 ...
- JS实现Web网页打印功能(IE)
问题描述: JS实现Web网页打印功能 问题解决: 这里主要使用WebBrowser控件的ExeWB在IE中打印功能的实现 WebBrowser介绍: WebBrows ...
- CF Gym100548 K Last Defence 解题报告
先特判掉特殊情况: $a=b,Ans=2$ $ab=0,a+b>0,Ans=2$ $a=b=0,Ans=1$ 考虑剩下的非特殊情况.记$Solve(a,b)$为数列中除了$a,b$外的不同的数的 ...
- 2013 Asia Regional Changchun
Hard Code http://acm.hdu.edu.cn/showproblem.php?pid=4813 #include<cstdio> ]; int main(){ int t ...
- linux服务器重启服务命令说明文档
(前提是电脑上面已经安装好了ssh软件~!)输入ip,用户名,端口(默认22) 输入密码,登陆成功之后, 转入到/usr/local/tomcat/bin 目录,输入命令行: [root@yangch ...