08 Transactions
本章提要
------------------------------------------
事务的特性
事务控制语句
------------------------------------------
事务, 把数据库从一种一致状态转变为另一种一致状态.
事务的特性:
1) 原子性, 事务所有动作要么都发生, 要么都不发生
2) 一致性, 事务将数据库从一种状态转变为下一种状态
3) 隔离性, 一个事务在该事务提交之前对其他事务都不可见
4) 持久性, 事务一旦提交, 其结果永久保留.
事务的控制语句
1) commit, 结束你的事务,并将事务提交到online redo log file中(磁盘文件).
2) rollback, 结束你的事务, 并回滚, 为此要读取存储在回滚段/undo段中的信息, 并把数据库块恢复到事务开始
之前的状态.
3) savepoint, 在你的事务中创建一个标记点
4) rollback to <savepoint>, 可以把事务回滚到标记点, 而不回滚在此标记点之前的任何工作.
5) set transaction, 允许你设置不同事务属性, 例如隔离级别
原子性
演示事务的原子性
create table t2( cnt int); insert into t2 values(0); commit; create table t ( x int check( x>0) ); create trigger t_trigger
before insert or delete on t for each row
begin
if (inserting) then
update t2 set cnt = cnt + 1;
else
update t2 set cnt = cnt - 1;
end if;
dbms_output.put_line('I fired and updated' ||
sql%rowcount || 'rows');
end;
/ -- test
set serveroutput on
insert into t values(1); select * from t2; -- result : 1 insert into t values(-1); select * from t2; -- result 还是 1, trigger中的output 已经正常输出了.
-- oracle 保证最初的insert 语句是原子性的, 所以, 这个insert 语句应该与
-- trigger 是在一个事务内, 而由于一个事务内的原子性特性, 外部insert语句
-- 被回滚了, 所以trigger中的语句也被回滚了, 不过它确实被执行过了.
8-1
语句级原子性(实现模拟, 如下:)
Savepoint statement1;
insert into t values(1);
if error then rollback to statement1;
Savepoint statement2;
insert into t values(-1);
if error then rollback to statement2;
过程级原子性
oracle 把 PL/SQL 匿名块也当做是语句.
演示
/*
* 例 1
* ---------------------------------------------------------
*/
create or replace procedure p
as
begin
insert into t values(1);
insert into t values(-1);
end;
/ update t2 set cnt = 0; delete from t;
commit;
select * from t; -- now rows selected
select * from t2; -- begin
p;
end;
/
-- 同样会得到错误提示
select * from t; -- 0 rows selected
-- 可见, 在匿名块中的两条Insert语句是一个事务, 具有原子性
select * from t2; -- -- 另一种测试
/*
* 例2
* --------------------------------------------------------------------
*/
begin
p;
exception
when others then
dbms_output.put_line('Error!!!!' || sqlerrm );
end;
/
-- 此时, t 和 t2 发生了变化, 因为第1条insert语句发生了作用
-- 而此时, 由于捕获了异常, 所以系统并没有自动回滚, 而是等带你的操作
-- 如果你 rollabck, 那么t中没有行 和 t2 是 0, 而如果你commit, 那么
-- 第一条 insert 会对数据库产生影响. 从这个例子可以看出, p 中的每条语句具有语句级原子性
-- 而匿名块具有事务级原子性.
rollback; /*
* 例 3
* ---------------------------------------------------------------------
*/
begin
savepoint sp;
p;
exception
when others then
rollback to sp;
dbms_output.put_line('Error!!!!' || sqlerrm);
-- 这样, 结果又是 0 了, 因为显示回滚到前面了
8-2
可见, 在一个存储过程内部的匿名块里的语句是具有相同的事务原子性.
启示: commit 或 rollback 一般情况下不应该出现在pl/sql块中, 只有pl/sql存储过程的调用者才知道事务何时完成.
匿名块内部的每条语句, 具有语句级原子性, 参看上边例子的后半段
ddl 语句具有自动提交, 并且具有事务级原子性, 比如:
演示
insert into t values(9); -- 注意, 此处并没有commit create table xxx(x int); -- 此时登陆别的session, 可以看到 9 这条记录已经插入了, 换句话说, 上边的
-- insert 语句也已经提交了
-- ddl 语句会自动提交, 事务级别的提交
8-3
完整性约束 和 事务
默认情况下, 完整性约束会在整个 sql 语句得到处理之后才进行检查.
immediate 约束
如果一个pl/sql存储过程中有很多sql语句,那么在每条sql语句执行之后都会立即验证完整性约束, 而不是在这个
存储过程完成后才检查它.
deferrable 约束 和 级联更新 (一般不推荐, 还是使用默认的immediate比较好)
不好的事务习惯
1) 在循环中提交
2) 使用自动提交
分布式事务
要利用远端数据库, dblink
update local_table set x = 5;
update remote_table@another_database set y = 10;
commit;
限制:
1) 不能在数据库链接上发出commit, 例如 commit@remote_site
2) 不能在数据库链接上完成ddl, ddl 会提交, 除了发起事务的站点外, 其他站点不能提交.
(所谓发起事务站点, 比如有1,2,3三个站点, 而1是发出站点, 那么1会问2,3准备好提交没有, 如果准备好了, 1可以
提交, 而此时网络中断, 那么2,3就会被挂起, 等待站点1的提交, 所以可见修改远端db还是很危险的)
3) 不能在数据库链接上发出 savepoint
08 Transactions的更多相关文章
- 事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)
1:本地事务DbTransaction和分布式事务TransactionScope的区别: 1.1:System.Data.Common.DbTransaction: 本地事务:这个没什么好说了,就是 ...
- Spring JTA multiple resource transactions in Tomcat with Atomikos example--转载
原文地址:http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-a ...
- 如何避免误用分布式事务(System.Transactions.TransactionScope)
以下内容来源与:http://www.cyqdata.com/cyq1162/article-detail-54453 1:本地事务DbTransaction和分布式事务TransactionScop ...
- Fragment Transactions & Activity State Loss
转自:http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html The foll ...
- LOCK TABLES和UNLOCK TABLES与Transactions的交互
LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...
- iOS系列 基础篇 08 文本与键盘
iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...
- javaEE基础08
javaEE基础08 一.继承 特点:继承父类的属性和方法,单继承(多继承) 特性:方法的复写(重写) 比如:人可以养狗 人------>狗:整体和部分(拥有)关系 关键字:extends 结构 ...
- The Myths about Transactions (ACID) and NoSQL
There has been widespread characterization of one of the major distinctions between NoSQL and tradit ...
- 【玩转单片机系列001】 08接口双色LED显示屏驱动方式探索
前些日子,从淘宝上购得一块08接口的双色LED显示屏(打算做个音乐频谱显示器),捣鼓了好几天,终于搞清楚了其控制原理,在这里做个总结,算是备忘吧. 1.LED显示屏的扫描方式 LED显示屏的扫描方式有 ...
随机推荐
- JavaEE基础(十四) /正则
1.常见对象(正则表达式的概述和简单使用) A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. 作用:比如注册邮箱,邮箱有用户名和 ...
- JavaEE基础(十)
1.面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 B:包的概述 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改, ...
- PHP正则表达式之定界符和原子介绍
1,正则表达式的定界符. 除了字母.数字和反斜线\以外的任何字符都可以为定界符号,比如 | |.//.{}.!!等等,但是需要注意,如果没有特殊需要,我们都使用正斜线//作为正则表达式的定界符号. 2 ...
- 【转】在Eclipse中建立第一个Servlet程序
转载地址:http://kin111.blog.51cto.com/738881/163354 继上篇在Eclipse中搭好了tomcat环境后,我们建立一个最简单的servlet程序,这个serve ...
- LA 4126 Password Suspects
问题描述:给定m个模式串,计数包含所有模式串且长度为n的字符串的数目. 数据范围:模式串长度不超过10,m <= 10, n <= 25,此外保证答案不超过1015. 分析:既然要计数给定 ...
- Unity物理投射相关问题整理
1.投射目标是否需要附加刚体,是否可忽略触发器? 默认既支持触发器,也支持刚体.投射的最后一个参数queryTriggerInteraction可以设置,是否包含触发器事件. 2.非射线投射,是否有接 ...
- web简单连接html文件测试
Web工程: 条件: apache-tomcat-6.0.20(文件夹/7.0)=======位于E盘 标题:链接服务器 步骤: 第一步:打开apache-tomcat-6.0.20-bin-star ...
- 2016年11月29日 星期二 --出埃及记 Exodus 20:20
2016年11月29日 星期二 --出埃及记 Exodus 20:20 Moses said to the people, "Do not be afraid. God has come t ...
- Linux下常用的shell命令记录1
硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息详细信息,如每个CPU的型号,主频等 内存相关 free -m #概要查看内存情况 ...
- winfrom增删改查
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...