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();
}
}
}
就发现程序出错,全部没有插进去。
转载于:https://www.cnblogs.com/firstdream/p/5482713.html
JDBC批处理---(java 对数据库的回滚) .相关推荐
- java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析
用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行 ...
- java pg数据库事务回滚_PG 事务提交与回滚
在PostgreSQL中,如果执行一个dml或ddl语句,默认一执行完就马上提交了,不能回滚,这样容易导致误操作的发生,避免这个风险的办法是关闭自动提交 1 设置\set AUTOCOMMIT off ...
- java pg数据库事务回滚_PostgreSQL事务特性之ROLLBACK
一.回滚DDL 1. 回滚表的创建 postgres=# begin; BEGIN postgres=# create table test (id int, name text); CREATE T ...
- Java的@Transactional事务回滚
@Transactional 基本原理概述 在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@ ...
- MySQL数据库的回滚失败(JAVA)
这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...
- javaWeb基础一:JDBC (java操作数据库的技术)
1. JDBC 1.1 含义 JDBC : java database connectivity 由SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. 1.2 ...
- javaweb中mysql数据库的回滚操作代码
2019独角兽企业重金招聘Python工程师标准>>> 在mysql中创建用户账户数据库(注意,count不能为负数,要设置无符号型) 添加数据 下面我们得到connection对象 ...
- java的oracle事务回滚_Oracle事务处理
二.事务和锁 当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户修改表的结构.这里对我们的用户来讲是非常重要的. 三.提交事务 当用commit语句执行时可以提交事务.当执 ...
- java中的事务回滚_Spring中的事务回滚机制
问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Transaction ...
- 01-JDBC概念--JDBC(Java Database Connectivity:Java数据库连接):使用jdbc实现Java与数据库MySQL连接
JDBC自学教程–终篇总结: 地址:http://blog.csdn.net/baidu_37107022/article/details/72600018 1.JDBC(Java Database ...
最新文章
- C++文件类(文件流类)及用法详解
- web前端技巧-ES6新特性与重点知识汇总(三)
- UDP对应的应用层协议之DHCP协议
- java猜数游戏图形界面_Java做一个猜数的小游戏
- chrome切换前端模式_Chrome调试工具developer tool技巧 - 轩枫阁
- Bootstrap+Font Awesome图标不显示 或显示错误解决办法
- 精选CSDN的ACM-ICPC专栏
- PHP开发小技巧①②—一些常用的PHP正则表达式
- mysql备份、还原数据库(命令行)
- 模电——电源与地之间串联电容的作用
- 使用Go语言开发生成阿里云ECS监控报表,定时自动发送邮件给指定人员
- Win10提示“无法使用内置管理员账户打开计算器”解决方案
- 阿里云云计算ACP学习(八)---网络与VPC
- 867 · 四键键盘
- ddns-go搭建ddns(动态域名解析)
- 若依框架(Ruoyi-vue)上传视频且回显
- 计算机主机的光驱怎么打开,笔记本电脑光驱怎么打开?高手教你打开笔记本光驱的方法...
- 电路板PCBA清洗工艺
- SQL必知必会第4版读书笔记
- 模拟一个火车站售票小例子