JDBC事务

JDBC的事务由Connection提供,默认是打开的。

要开启事务,则要关闭自动提交,

 conn.setAutoCommit(false);

提交事务使用

 conn.commit();

回滚事务使用

 conn.rollback();

可以在某个位置设置一个保存点,回滚时只回滚到这个点,

 try {
Savepoint sp = conn.setSavepoint();
...
} catch (SQLException e) {
conn.rollback(sp);
}

当Connection遇到一个未处理的SQLException异常时,系统会非正常退出,事务还是会自动回滚。但如果程序捕获了该异常,则需要在异常处理块中显示地回滚。

下面演示JDBC事务的基本用法,

 package db;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class TransactionTest {
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
//用Properties类加载属性文件
Properties prop = new Properties();
prop.load(new FileInputStream(paramFile));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("pass");
Class.forName(driver);
}
public void insertInTransaction(String[] sqls) throws SQLException{
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
//关闭自动提交,即开启事务
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
for (String sql : sqls) {
stmt.executeUpdate(sql);
}
//提交事务
conn.commit();
}catch (SQLException e) {
conn.rollback();
System.out.println("Exception:");
System.out.println(e.getMessage());
}
}
}
public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
TransactionTest tt = new TransactionTest();
tt.initParam("mysql.ini");
String[] sqls = new String[] {
"insert into jdbc_test values (null, 'aaa','111')",
"insert into jdbc_test values (null, 'bbb', '222')",
"insert into jdbc_test values (null, 'ccc', '333')",
//下面这条sql会失败,因为已经存在主键为2的记录
"insert into jdbc_test values (2, 'ddd','444')"
};
tt.insertInTransaction(sqls);
}
}

上面的第53行sql会引发SQLException异常, 因此前面三个insert都会被回滚, 程序执行如下,

 Exception:
Duplicate entry '2' for key 'PRIMARY'

JDBC批量更新

使用批量更新时,多条sql语句将被作为同一批操作被同时收集,同时提交。

使用Statement收集sql的方法为

 stmt.addBatch(sql1);
stmt.addBatch(sql1);
stmt.addBatch(sql1);
...

同时执行所有sql的方法为执行Statement的executeBatch().  (JDK.8中如果执行影响记录太多,则可以用executeLargeBatch()方法)

stmt.executeBatch();

之后可以提交更新,为了达到批量更新的目的,程序应该在批量操作之前关闭自动提交,然后收集sql,当批量操作执行之后,提交事务,并恢复之前的自动提交模式。

关键代码如下,

     public void insertInTransaction(String[] sqls) throws SQLException{
try ( Connection conn = DriverManager.getConnection(url, user, pass)) {
//关闭自动提交,即开启事务
conn.setAutoCommit(false);
try(Statement stmt = conn.createStatement()) {
for (String sql : sqls) {
stmt.addBatch(sql);
}
stmt.executeBatch();
//提交事务
conn.commit();
} catch (SQLException e) {
conn.rollback();
System.out.println("Exception:");
System.out.println(e.getMessage());
} finally {
conn.setAutoCommit(true);
}
}
}

JAVA基础知识之JDBC——JDBC事务处理及批量更新的更多相关文章

  1. java基础知识-笔记整理

    1.查看已安装jdk文件路径 CMD输入java -verbose.   2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...

  2. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  3. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  4. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  5. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  6. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  7. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  8. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  9. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  10. Java 基础知识(一)

    Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...

随机推荐

  1. IEnumerable和IQueryable区别、优缺点

    转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...

  2. stdout( 标准输出流)和 stderr( 标准输入流) 重定向问题

    我想把提示信息和错误信息列表都写入到同一个文件里, /* ** 设置流, 使输出与错误流都指向指定的文件 */ if( (output1 = freopen( PATH, "a", ...

  3. nyoj-204

    描述国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的. 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠.如果把B端接触镜面的话,魔镜会把这 ...

  4. IOS第二天

    第二天 *******图片的放大,和缩小 (去掉自动的布局) -(IBAction ) zoomFrame:(UIbutton *) button{ CGRect frame= self.iconBu ...

  5. 【iCore3 双核心板】例程五:SYSTICK定时器实验——定时点亮LED

    实验指导书及代码包下载: http://pan.baidu.com/s/1eQsKcEY iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  6. Sharepoint 2013 网站集的删除与还原

    一.可以通过三种方法删除网站集: 1.打开Sharepoint 2013 管理页面首页 ---> 单击‘应用程序管理(Application Management)’并进入该页面 ---> ...

  7. Postgres-enum

    -- 1. rename the enum type you want to change alter type some_enum_type rename to _some_enum_type; - ...

  8. json解析jackson ,Gson,等知识总结

    相关资料链接: Java构造和解析json数据的两种方法详解 java解析json Android网络之数据分析---使用Google Gson 解析Json数据 使用jackson在java中处理j ...

  9. 【微信开发】 新浪SAE开发平台 注意事项

    1. 微信开发 新浪SAE开发平台 验证Token 一直失败? 这个问题困扰了一个又一个的微信学习者,现在百度到的答案有:在echo $echoStr;之前添加header('content-type ...

  10. Git 实战教程

    CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的 ...