JDBC 事务

@author ixenos

事务


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

2.需求背景:将多个语句组合成事务的主要原因是为了确保数据库完整性(database integrity)

3.默认情况下,数据库连接处于自动提交模式(autocommit mode),每个SQL语句一旦被执行便被提交给数据库,一旦命令被提交就无法对它进行回滚操作;

  而我们在使用事务时,就要关掉这个默认值:

conn.setAutoCommit(false);

//以下是一般的执行流程
Statement stmt = conn.createStatement();
//任意多次调用executeUpdate方法
stmt.executeUpdate(command1);
stmt.executeUpdate(command2);
stmt.executeUpdate(command3);
.... //如果没有捕获异常而走到了这一步,那么调用commit方法
conn.commit(); //捕获到了异常,则调用rollback,自动撤销上次提交以来的所有语句
conn.rollback();

保存点(save point)


1.使用保存点可以更细粒度地控制回滚(rollback)操作

2.创建一个保存点意味着只需返回到这个点,而非事务的开头

conn.setAutoCommit(false);
//事务开始
Statement stmt = conn.createStatement();
stmt.executeUpdate(command1); //创建保存点
Savepoint spoint = conn.setSavepoint(); stmt.executeUpdate(command2); if(.....){
conn.rollback(spoint); //撤销command2的影响
} ...
conn.commit();

3.当不需要保存点时,释放它

conn.releaseSavepoint(spoint);

批量更新(batch update)


1.需求背景:一个程序需要执行许多INSERT语句,以便将数据填入数据库表中,此时可以使用批量更新的方法来提高性能

2.注意:

(1)处于同一批中的语句可以使INSERT、UPDATE和DELETE操作,也可以是数据库定义的语句,如CREATE TABLE和DROP TABLE

(2)但是在批量处理中添加SELECT语句将抛出异常! 因为批量处理SELECT语句是没有意义的,因为只是返回结果集,而不会更新数据库!

3.示例:

Statement stmt = conn.createStatement();

//此时调用addBatch冯方法,而非executeUpdate方法
String command = "CREATE TABLE ...";
stmt.addBatch(command); while(...){
command = "INSERT INTO ... VALUES(" + ... + ")";
stmt.addBatch(command);
} //最后提交整个批量更新语句
int[] counts = stmt.executeBatch();

  

事务mix批量更新


  为了在批量模式下正确识别错误,必须将批量执行的操作视为单个事务(原子性),如果批量更新在执行过程中失败,那么必须将它会滚到批量操作开始之前的状态。

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

//备份原来提交模式的参数
boolean autoCommit = conn.getAutoCommit(); //设置手动提交事务,将批量更新视为一个事务
conn.setAutoCommit(false); //执行一系列 stmt.addBatch(...); 操作
Statement stmt = conn.getStatement();
...
stmt.addBatch(...)
... //先批量更新,成为一个批量更新事务
stmt.executeBatch(); //确定提交 批量更新 事务
conn.commit(); //还原原来的提交模式的参数
conn.setAutoCommit(autoCommit);

  

恢复日志


1.撤销修改(rollback)的实现,基本的解决方案是:DB系统会永久保存一个日志,日志中记录了修改的详细信息,特别是记录每次修改对象之前的值和修改对象之后的值;因此,如果要撤销特定的修改,DB系统会使用相应的日志记录把修改对象恢复到初始值(修改前的值)

2.撤销修改的过程必须遵循:事先写入日志规则;即给定修改的日志记录必须在这个修改被实际写入到数据库之前记录到日志文件中;

(1)对于给定事务的所有其他日志都要在该事务COMMIT记录被物理地写入日志之前,被物理地写入到日志

(2)直到该事务的COMMIT记录被物理地写入到日志中,COMMIT处理才能完成

  遵循该规则的事务不仅是一个工作单元,也是一个恢复单元。

事务的ACID特性


ACID代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

1.原子性:事务要么全部执行,要么全部不执行;

2.一致性:事务把数据库从一个一致性状态转换到另一个一致性状态,不去考虑中间状态;

3.隔离性:任何事务的修改都与其他事务隔离,直到该事务被成功提交;(锁!)

4.持久性:一旦事务被成功提交,所有的修改会被永久保存在数据库中;

#原子性和持久性的含义是事务分别是一个工作单元和一个恢复单元;

#一致性的含义是事务是完整性单元;

#隔离性的含义是事务是并发单元

JavaEE JDBC 事务的更多相关文章

  1. JDBC事务和JTA事务的区别

    转自:JDBC和JTA事务的区别 一.事务概述事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做.与事务相关的操作主要有:BEGIN TRANSACTION: 开 ...

  2. 分层架构下的纯JDBC事务控制简单解决方案【转】

    http://blog.csdn.net/qjyong/article/details/5464835 对目前的JavaEE企业应用开发来说,基本都会采用分层的架构, 这样可以分散关注.松散耦合.逻辑 ...

  3. jdbc事务、连接池概念、c3p0、Driud、JDBC Template、DBUtils

    JDBC 事务控制 什么是事务:一个包含多个步骤或者业务操作.如果这个业务或者多个步骤被事务管理,则这多个步骤要么同时成功,要么回滚(多个步骤同时执行失败),这多个步骤是一个整体,不可分割的. 操作: ...

  4. JTA和JDBC事务

    一般情况下,J2EE应用服务器支持JDBC事务.JTA事务.容器管理事务.这里讨论JTA和JDBC事务的区别.这2个是常用的DAO模式事务界定方式.JDBC 事务 JDBC 事务是用 Connecti ...

  5. JDBC 事务控制

    一.简介: 前面一遍提到了jdbc事务相关的概念.从中了解到事务应具有ACID特性.所以对于javaweb开发来说,某一个service层的方法,应该是一个事务,应该是具有原子性的.特别是当一个ser ...

  6. Java的JDBC事务详解(转)

    事务的特性: 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行. 2) 一致性(consistency):事务在完 ...

  7. Java中的事务——JDBC事务和JTA事务

    Java中的事务——JDBC事务和JTA事务 转载:http://www.hollischuang.com/archives/1658 之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中 ...

  8. CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

    JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...

  9. JDBC 事务隔离级别

    JDBC 事务隔离级别     先解释一下:a:脏读取:一个事务读取了另外一个并行事务未提交的数据b:不可重复读取:一个事务再次读取之前的数据时得到的数据不一致,被另外一个事务修改c:虚读:一个事务重 ...

随机推荐

  1. Triangular Pastures POJ - 1948

    Triangular Pastures POJ - 1948 sum表示木条的总长.a[i]表示第i根木条长度.ans[i][j][k]表示用前i条木条,摆成两条长度分别为j和k的边是否可能. 那么a ...

  2. 题解报告:hdu 2072 单词数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 题目: Problem Description lily的好朋友xiaoou333最近很空,他想 ...

  3. Oracle10g修改数据库字符集

    Oracle10g修改字符集记录: 版本:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production 参考 ...

  4. 【先定一个小目标】Asp.net Core 在IIS上的托管运行

    1.安装 .NET Core Framework 下载.net core地址:官网地址 2.Install IIS 在控制面板->程序与功能->Internet Infomation Se ...

  5. JAVA Android王牌教程

    Java基础 在Java基础系列文章中,我将说明Java的基础内容,特别是面向对象的相关概念. Java基础01 从HelloWorld到面向对象 Java基础02 方法与数据成员 Java基础03 ...

  6. 前台js获得json数据

    $.ajax({ type:"post", url:"testAction.action", data:{ classId:classId }, success ...

  7. 什么是LambdaExpression,如何转换成Func或Action(2)

    序言 在上一篇中,我们认识了什么是表达式树.什么是委托,以及它们的关系.可能是我功力不好,貌似大家都不怎么关注,没有讲解出不同角度的问题. 学习一种新技术,是枯燥的过程,只有在你掌握后并能运用时才能从 ...

  8. Sass的的使用一

    sass -v 检测是否安装 Sass 成功 gem update sass 更新 Sass gem uninstall sass 删除/卸载 Sass 的编译有多种方法: 1.命令编译2.GUI工具 ...

  9. jquery中ajax使用error调试错误

    error:function (XMLHttpRequest, textStatus, errorThrown) { } XMLHttpRequest.readyState状态码  0:未初始化还没有 ...

  10. c++ 模板template

    1.函数模板的声明 声明形式 template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) {     函数体 } 注: templa ...