JavaEE JDBC 事务
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 事务的更多相关文章
- JDBC事务和JTA事务的区别
转自:JDBC和JTA事务的区别 一.事务概述事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做.与事务相关的操作主要有:BEGIN TRANSACTION: 开 ...
- 分层架构下的纯JDBC事务控制简单解决方案【转】
http://blog.csdn.net/qjyong/article/details/5464835 对目前的JavaEE企业应用开发来说,基本都会采用分层的架构, 这样可以分散关注.松散耦合.逻辑 ...
- jdbc事务、连接池概念、c3p0、Driud、JDBC Template、DBUtils
JDBC 事务控制 什么是事务:一个包含多个步骤或者业务操作.如果这个业务或者多个步骤被事务管理,则这多个步骤要么同时成功,要么回滚(多个步骤同时执行失败),这多个步骤是一个整体,不可分割的. 操作: ...
- JTA和JDBC事务
一般情况下,J2EE应用服务器支持JDBC事务.JTA事务.容器管理事务.这里讨论JTA和JDBC事务的区别.这2个是常用的DAO模式事务界定方式.JDBC 事务 JDBC 事务是用 Connecti ...
- JDBC 事务控制
一.简介: 前面一遍提到了jdbc事务相关的概念.从中了解到事务应具有ACID特性.所以对于javaweb开发来说,某一个service层的方法,应该是一个事务,应该是具有原子性的.特别是当一个ser ...
- Java的JDBC事务详解(转)
事务的特性: 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行. 2) 一致性(consistency):事务在完 ...
- Java中的事务——JDBC事务和JTA事务
Java中的事务——JDBC事务和JTA事务 转载:http://www.hollischuang.com/archives/1658 之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中 ...
- CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)
JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...
- JDBC 事务隔离级别
JDBC 事务隔离级别 先解释一下:a:脏读取:一个事务读取了另外一个并行事务未提交的数据b:不可重复读取:一个事务再次读取之前的数据时得到的数据不一致,被另外一个事务修改c:虚读:一个事务重 ...
随机推荐
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- 转】在Ubuntu中安装Cassandra
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/ 感谢! Posted: Mar 22, 2014 Tags: cas ...
- Oracle用户角色权限相关视图
常用相关视图概述 DBA_SYS_PRIVS: 查询某个用户所拥有的系统权限 USER_SYS_PRIVS: 当前用户所拥有的系统权限 SESSION_PRIVS: 当前用户所拥有的全部权限 ROLE ...
- 学习笔记 第九章 使用CSS美化表格
第9章 使用CSS美化表格 学习重点 正确使用表格标签: 设置表格和单元格属性: 设计表格的CSS样式. 9.1 表格的基本结构 表格由行.列.单元格3部分组成,单元格时行与列交叉的部分. 在HTM ...
- Android Studio中找出不再使用的资源
顶部Analyze菜单中选择Run Inspection by Name 在弹出的输入框中输入unused resources
- [翻译] API测试最佳实践 - 组织你的测试
组织你的测试 适用级别:初学者 在最底层,一个测试步骤(Test Step)用来验证一个单独的操作.组合若干测试步骤到测试用例,允许你验证那些被分隔出来的一个一个的功能,这些功能是应用程序所需要的.接 ...
- Xcode 9 打印信息解决
Xcode 9 打印信息解决 打印信息 1 nw_proxy_resolver_create_parsed_array PAC evaluation error: kCFErrorDomainCFNe ...
- 这是一条立了Flag的不归路
时间2017年7月11日 14:48:40 首次激活博客园的博客来进行学习记录,立下了不算远大的小目标,下一步就是要一步一步的往前走. Java是目前最普遍的使用语言之一,作为一名测试,本应该去学习更 ...
- 开放API接口
[开放API]——知乎.博客园等开放API接口(更新ing) Cnodejs.org: https://cnodejs.org/api/ 和风天气: http://docs.heweather.c ...
- CAD参数绘制线型标注(网页版)
主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...