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:虚读:一个事务重 ...
随机推荐
- 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town
题目传送门 /* 题意: 求(n-1)! mod n 数论:没啥意思,打个表能发现规律,但坑点是4时要特判! */ /***************************************** ...
- JS 对输入判断变化屏蔽中文输入法连续输入时触发的事件
//智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', function () { ...
- jmeter(十七)逻辑控制器
JMeter中的Logic Controller用于为Test Plan中的节点添加逻辑控制器. JMeter中的Logic Controller分为两类:一类用来控制Test Plan执行过程中节点 ...
- 转】MongoDB主从复制实验 master/slave
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: May 31, 2013 Ta ...
- dockerfile构建的镜像
转载请注明出处 https://www.cnblogs.com/majianming/p/9536975.html 在每执行一个命令时,便会commit形成一个层,最后形成堆栈式的结构.最后的镜像是各 ...
- Windowsforms 中 进程,线程
进程: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动. 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. Process 类,用来操作进程. 命名空间:using Syst ...
- P1583 魔法照片
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...
- 让px单位自动转换为rem的方法
开发工具: 编辑器:vscode; css预处理器:less;(无具体要求): 步骤: 1. vscode安装cssrem插件: 2. 修改css插件的默认配置,其默认转换p ...
- linux 安装 mongo 3.4
要求:linux 安装 mongo 3.4 大体上,按照官网提供的方法来做. 系统是ubuntu 16.04 安装的是mongo3.4.8 社区版 1. 导入导入包管理系统使用的公钥 ...
- pthread Win32多线程编程的一些知识和感想
研究遗传算法的一大诟病就是每次运行程序的结果并不是完全一样的,有时候能找到最优解有时候找不到最优解,这就是遗传算法的概率性导致的.那么怎么评价你的方法的好坏呐,这时候就要多次独立运行程序最后取结果的平 ...