我们可以将一组语句构建成一个事务(transaction)。当所有语句都顺利执行之后,事务可以提交(commit)。否则,如果其中某个语句遇到错误,那么事务将被回滚,就好像没有任何语句被执行过一样。

将多个语句组合成事务的主要原因是为了确保数据库完整性(database integrity)。例如,假设我们需要将钱从一个银行账号转移到另一个账号。此时,一个非常重要的问题就是我们必须同时将钱从一个账号取出并且存入另一个账号。如果在将钱存入其他账号之前系统发生崩溃,那么我们必须撤销取款操作。

如果将更新语句组合成一个事务,那么事务要么成功地执行所有操作并提交,要么期间某个位置发生失败。在这种情况下,可以执行回滚(rollback)操作,则数据库将自动撤销上次提交事务以来的所有更新操作产生的影响。

默认情况下,数据库连接处于自动提交模式(autocommit mode)。每个SQL语句一旦被执行便被提交给数据库。一旦命令被提交,就无法对它进行回滚操作。在使用事务时,需要关闭这个默认值:

conn.setAutoCommit(false);

现在可以使用通常的方法创建一个语句对象:

Statement stat = conn.createStatement();

然后任意多次调用executeUpdate方法:

stat.executeUpdate(command1);

stat.executeUpdate(command2);

stat.executeUpdate(command3);

...

如果执行了所有命令之后没有出错,则调用commit方法:

conn.commit();

如果出现错误,则调用:

conn.rollback();

此时,程序将自动撤销自上次提交以来的所有语句。当事务被SQLException异常中断时,典型的方法就是发起回滚操作。

1. 保存点

在使用某些驱动程序时,使用保存点(save point)可以更细粒度地控制回滚操作。创建一个保存点意味着稍候只需返回到这个点,而非事务的开头。例如,

Statement stat = conn.createStatement(); //开启一个事务;rollback()返回这里

stat.executeUpdate(command1);

Savepoint svpt= conn.setSavepoint(); //设置保存点;rollback(svpt)返回到这里

stat.executeUpdate(command2);if(...) conn.rollback(svpt); //撤销command2产生的影响

...

conn.commit();

当不再需要保存点时,必须释放它:

conn.releaseSavepoint(svpt);

2. 批量更新

假设有一个程序需要执行许多INSERT语句,以便将数据填入数据库表中,此时可以使用批量更新的方法来提高程序性能。在使用批量更新(batch update)时,一个语句序列作为一批操作将同时被收集和提交。

注意:使用DatabaseMetaData接口中的supportsBatchUpdates方法可以获知数据库是否支持这种特性。

处于同一批中的语句可以是INSERT、UPDATE和DELETE等操作,也可以是数据库定义语句,如CREATE TABLE和DROP TABLE。但是,在批量处理中添加SELECT语句会抛出异常(从概念上讲,批量处理中的SELECT语句没有意义,因为它会返回结果集,而不更新数据库)。

为了执行批量处理,首先必须使用通常的办法创建一个Statement对象:

Statement stat = conn.createStatement();

现在应该调用addBatch方法,而非executeUpdate方法:

String command = "CREATE TABLE..."stat.addBatch(command);while(...){

command= "INSERT INTO ... VALUES("+...+")";

stat.addBatch(command);

}

最后,提交整个批量更新语句:

int[] counts = stat.executeBatch();

调用executeBatch方法将为所有已提交的语句返回一个记录数的数组。

为了在批量模式下正确地处理错误,必须将批量执行的操作视为单个事务。如果批量更新在执行过程中失败,那么必须将它回滚到批量操作开始之前的状态。

首先,关闭自动提交模式,然后收集批量操作,执行并提交该操作,最后恢复最初的自动提交模式:

boolean autoCommit =conn.getAutoCommit();

conn.setAutoCommit(false);

Statement stat=conn.getStatement();

...//keep calling stat.addBatch(...);

...

stat.executeBatch();

conn.commit();

conn.setAutoCommit(autoCommit);

java 事务 数据库 事务_Java数据库编程——事务相关推荐

  1. java数据库驱动_Java数据库驱动链接大全

    Java数据库驱动链接大全 MySQL: String Driver="com.mysql.jdbc.Driver";    //驱动程序 String URL="jdb ...

  2. java mysql 操作类_Java 数据库简单操作类

    1 packagecom.latiny.db;2 3 import java.io.*;4 import java.sql.*;5 importjava.util.ArrayList;6 import ...

  3. java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...

    java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...

  4. java 数据分析 用户信息_Java数据库——使用元数据分析数据库

    在JDBC中提供了DatabaseMetaData和ResultSetMetaData接口来分析数据库的元数据. DatabaseMetaData 使用DatabaseMetaData取得数据库的元信 ...

  5. java数据库技术_JAVA数据库技术

    2016-11-03 JDBC(java Database connection,)是一种用于执行SQL语句的API,他是有一些java语言写的类和界面组成,他提供了了标准的应用程序接口,是开发人员可 ...

  6. java数据库配置_Java数据库配置(一)

    1.加载驱动 Class.forname(数据库驱动名); 1.1.下载驱动 在加载数据库驱动之前,我们要下载数据库驱动.一版情况下若想使用哪个数据库的驱动,在哪个数据库的官方网站就能找到java版本 ...

  7. java访问数据库方式_java数据库访问(二)—JDBC方式(配合连接池)

    上文记录了最基础的JDBC连接数据库的方法,但能看出一个问题,就是要不断的重复去创建connection和关闭connection,如果在对数据库的访问比较频繁的情况下,这种处理方式方式在性能方面是不 ...

  8. java异常对象引用变量_Java面向对象编程-异常处理

    第九章 异常处理 异常情况会改变正常的流程,导致恶劣的后果,为了减少损失,应该事先充分预料所有可能出现的异常,然后采取以下措施: 首先考虑避免异常,彻底杜绝异常的发生:如果不能完全避免,则尽可能地减少 ...

  9. java并发数据共享机制_Java并发编程:核心理论之数据共享性

    原标题:Java并发编程:核心理论之数据共享性 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这 ...

  10. java类声明语句_Java面向对象编程-类的声明周期

    第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...

最新文章

  1. 码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
  2. 自己动手实现一个malloc内存分配器 | 30图
  3. 将springboot打包成的jar文件做成windows服务
  4. LTE学习:LTE系统中RB、RBG、CCE、REG分别是如何定义的
  5. 64位centos下QQ无法输入中文只能输入英文
  6. 搭建vue项目时运行npm run dev 报错问题解决
  7. HIVE json格式数据的处理
  8. RTSP的音频视频要各SETUP一次
  9. [WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
  10. 打游戏经常有人喷,刷个B站还是有?Python实现在网站上自动评论!键盘侠都喷不赢你!
  11. IOS nonatomic 与 atomic 的区别
  12. (231)Verilog HDL:减法器
  13. 如何向Google提交网站?(转)
  14. NETCore项目报错 An error occurred while starting the application
  15. 一起少女失踪案背后的非法拘禁团伙。
  16. centos 6.8使用wine安装QQ2016
  17. 低成本MEMS惯导系统的捷联惯导解算MATLAB仿真
  18. python爬取动态网页图片
  19. EVER17剧情简介,之前玩过,回忆下
  20. 深圳现手机电脑混血产品XPphone

热门文章

  1. FreeBSD下安装配置Hadoop集群(性能调优)
  2. 【MM模块】Split Valuation 分割评估
  3. 【ABAP增强】基于BADI的增强
  4. 把内表 itab1 的 n1 到 n2 行内容附加到 itab2 内表中去.
  5. SAP ABAP SQL查询分析器
  6. 释疑の删除多余的ALV布局以及选择条件变式
  7. 2、Power Query-动态汇总单元格区域数据
  8. FICO年结完全手册
  9. Web Dynpro ABAP---ALV控件的使用
  10. SAP HANA会代替BW吗?