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:虚读:一个事务重 ...
随机推荐
- K - KazaQ’s Socks
Bryce1010模板 #include <bits/stdc++.h> using namespace std; #define LL long long int main() { LL ...
- 异或+构造 HDOJ 5416 CRB and Tree
题目传送门 题意:给一棵树,问f (u, v) 意思是u到v的所有路径的边权值的异或和,问f (u, v) == s 的u,v有几对 异或+构造:首先计算f (1, u) 的值,那么f (u, v) ...
- 暴力 hihoCoder 1178 计数
题目传送门 /* 暴力:这题真是醉了,直接暴力竟然就可以了!复杂度不会分析,不敢写暴力程序.. 枚举x,在不重复的情况下+ans,超过范围直接break */ #include <cstdio& ...
- C# 判断是否移动设备
/// <summary> /// 判断是否移动设备. /// </summary> /// <returns></returns> public st ...
- GIT配置及用法
ssh配置 TortoiseGit配置 用法: 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓 ...
- Redis相关问题收集
问题一.强制关闭Redis快照导致不能持久化 MISCONF Redis is configured to save RDB snapshots, but is currently not able ...
- Android学习笔记-事件处理之Handler消息传递机制
内容摘要:Android Handler消息传递机制的学习总结.问题记录 Handler消息传递机制的目的: 1.实现线程间通信(如:Android平台只允许主线程(UI线程)修改Activity里的 ...
- sublime text3安装Package Control
转自:https://www.cnblogs.com/lq147760524/p/8202521.html 一.下载Sublime3 https://www.sublimetext.com/3 二.安 ...
- java web 学习笔记 - 表达式语言
1.表达式语言简介 主要为了简化mvc中 jsp的代码量,方便进行属性的输出.还可以避免进行属性为空等的判断,表达式默认将null设置为"". 表达式语言的一个最大的好处就是,只需 ...
- COPY - 在表和文件之间拷贝数据
SYNOPSIS COPY tablename [ ( column [, ...] ) ] FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ O ...