一、概念
事务是由相关操作构成的一个完整的操作单元。两次连续成功的COMMIT或ROLLBACK之间的操作,称为一个事务。在一个事务内,数据的修改一起提交或撤销,如果发生故障或系统错误,整个事务也会自动撤销。
二、理解
我们去银行转账,操作可以分为下面两个环节:
(1) 从第一个账户划出款项。
(2) 将款项存入第二个账户。
在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。数据库事务是一个逻辑上的划分,有的时候并不是很明显,它可以是一个操作步骤,也可以是多个操作步骤。
理解数据库事物:
对数据库所做的一系列修改,在修改过程中,暂时不写入数据库,而是缓存起来,用户在自己的终端可以预览变化,直到全部修改完成,并经过检查确认无误后,一次性提交并写入数据库,在提交之前,必要的话所做的修改都可以取消。提交之后,就不能撤销,提交成功后其他用户才可以通过查询浏览数据的变化。
三、优点
1. 把逻辑相关的操作分成了一个组。
2. 在数据永久改变前,可以预览数据变化。
3.能够保证数据的读一致性
四、应用
数据库事务处理可分为隐式和显式两种。
1、显式事务:操作通过命令实现
2、隐式事务:由系统自动完成提交或撤销(回退)工作,无需用户的干预。
隐式提交的情况包括:
1、当用户正常退出SQL*Plus或执行CREATE、DROP、GRANT、REVOKE等命令时会发生事务的自动提交。
2、还有一种情况,如果把系统的环境变量AUTOCOMMIT设置为ON( 默认状态为OFF) , 则每当执行一条INSERT 、DELETE 或UPDATE命令对数据进行修改后,就会马上自动提交。设置命令格式如下:
SET AUTOCOMMIT ON/OFF
隐式回退的情况包括:当异常结束SQL*Plus或系统故障发生时,会发生事务的自动回退。
显式事务处理的数据库事务操作语句有3条
语 句 |
描 述 |
COMMIT |
数据库事务提交,将变化写入数据库 |
ROLLBACK |
数据库事务回退,撤销对数据的修改 |
SAVEPOINT |
创建保存点,用于事务的阶段回退 |
COMMIT操作把多个步骤对数据库的修改,一次性地永久写入数据库,代表数据库事务的成功执行。
ROLLBACK操作在发生问题时,把对数据库已经作出的修改撤消,回退到修改前的状态。在操作过程中,一旦发生问题,如果还没有提交操作,则随时可以使用ROLLBACK来撤消前面的操作。
SAVEPOINT则用于在事务中间建立一些保存点
ROLLBACK可以使操作回退到这些点上边,而不必撤销全部的操作。一旦COMMIT完成,就不能用ROLLBACK来取消已经提交的操作。一旦ROLLBACK完成,被撤消的操作要重做,必须重新执行相关操作语句。
五、开始
一般情况下,开始一个会话(即连接数据库),执行第一条SQL语句将开始一个新的事务,或执行COMMIT提交或ROLLBACK撤销事务,也标志新的事务的开始。另外,执行DDL(如CREATE)或DCL命令也将自动提交前一个事务而开始一个新的事务。
示例:
第一步:查询所有表数据
第二步:插入一条数据(id=14那条)
第三步:插入保存点,检查点的名称为PA:
第四步:插入另一条数据(id=15那条)
第五步:再插入保存点,检查点的名称为PA1:
第六步:展示数据
insert into AZJuserInfor values (abc.nextval,'张四',to_date('2012-02-13','yyyy:MM:dd'),0,1);
SAVEPOINT pa;
insert into AZJuserInfor values (abc.nextval,'张四儿',to_date('2012-02-13','yyyy:MM:dd'),10,1);
select t.*, t.rowid from azjuserinfor t order by id;
SAVEPOINT pa1;
select t.*, t.rowid from azjuserinfor t order by id;
第七步:删除id=13的数据,展示数据
第八步:回退到保存点PA
1
第八步:回退到保存点PA
此时不可再回退至pa1
第九步:提交
提交完成
实际执行效果是,插入了一条数据,并未进行后续的插入及删除操作
一个具体的java实现例子:
学习网址:http://zmx.iteye.com/blog/371005
代码如下:
public class SavePointTest {
public static void main(String[] args) throws SQLException {
test();
}
static void test() throws SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
Savepoint sp = null;
try {
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false); //设置禁止自动提交
st = conn.createStatement();
String sql = "update user set money=money-10 where id=1";
st.executeUpdate(sql);
sp = conn.setSavepoint();//插入保存点
sql = "update user set money=money-10 where id=3";
st.executeUpdate(sql);
sql = "select money from user where id=2";
rs = st.executeQuery(sql);
float money = 0.0f;
if (rs.next()) {
money = rs.getFloat("money");
}
if (money > 300)
throw new RuntimeException("已经超过最大值!");
sql = "update user set money=money+10 where id=2";
st.executeUpdate(sql);
conn.commit();
} catch (RuntimeException e) {
if (conn != null && sp != null) {
conn.rollback(sp);//回滚到那个事务点上去
conn.commit();
}
throw e;
} catch (SQLException e) {
if (conn != null)
conn.rollback();
throw e;
} finally {
JdbcUtils.free(rs, st, conn);
}
}
}
分享到:
相关推荐
Oracle数据库 数据库——数据库安全性管理 数据库安全性管理 ⼀、涉及内容 1.验证系统权限管理。 2.验证⾓⾊管理。 3.验证概要⽂件管理。 ⼆、具体操作 (⼀) 1.根据以下要求进⾏系统权限的授予与回收操作。 (1)...
如何安装、运行、管理、监控、联网和调整Oracle——包括企业管理器(EM)以及Oracle自我调整和管理能力——以及如何使用Oracle安全、审计和依从性(本版中新增的——章内容)。多用户并发、数据仓库、分布式数据库、...
8.2.8 存储过程的参数——参数顺序总结 153 8.3 程序包 153 8.3.1 规范 153 8.3.2 主体 155 8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 ...
EJB——事务,会话等详细资料,吐血整理,强力推荐,数据库提升的快速门道
在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。 ——亚马逊读者评论 目录 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*...
Oracle数据库自带的几个触发器(最简单触发器格式)示例如下: -- create or replace trigger MDSYS.sdo_drop_user after drop on DATABASE declare stmt varchar2(200); BEGIN if dictionary_obj_type = 'USER...
这或许就是我选择这门课——数据库的原因吧! 本学期开学,我自己通过看书、上网了解到了数据库的许多更专业的知识。我大致了 解到了数据库具体是用来做什么,需要处理那些问题的了。 首先,数据库是数据管理的最新...
ORACLE用户是学习ORACLE数据库中的基础知识,下面就介绍下类系统常用的默认ORACLE用户: 1. sys用户:超级用户,完全是个SYSDBA(管理数据库的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,...
常见主流数据库分类 1、IBM 的DB2 作为关系数据库领域的开拓者和领航人,IBM在1977年完成了System R系统的原型,1980年开始提供集成的数据库服务器—— System/38,随后是SQL/DSforVSE和VM,其初始版本与SystemR研究...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
域名,可以只使用 库名——SID区分大小写——……——数据路径选择,模版默认的是$ORACLE_BASE/oradata/dababase——备份数据的路径——内存分配(SGA专用内存,事务处理为主;PGA系统内存,数据为主)|Sizing中的块...
共计2个视频 1 事务 2 锁
2.2.1. ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控: 19 2.2.2. 每天的工作 20 2.2.3. 每周的工作 21 2.2.4. 每月的工作 22 DBA例行工作 22 2.3. 开发 DBA 工作 24 3. 操作系统和服务器硬件 25 ...
现阶段企业所使用的数据库管理系统的种类 MS SQL SYBASE DB2 ORACLE MySQL ACCESS VF 选择原则 选择数据库管理系统时应从以下几个方面予以考虑: (1) 构造数据库的难易程度。 需要分析数据库管理系统有没有范式的...
例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/...
2020 DTC 数据技术嘉年华演讲PPT汇总(共43篇),供大家学习参考。 数据库智能运维(含手机端远程运维)建设实践 伴鱼数据库架构选型及平台化建设的思考与实践 腾讯云数据库打造国产化生态,助力政企数字化转型 ...