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; -- 0

begin
    p;
end;
/
-- 同样会得到错误提示
select * from t;  -- 0 rows selected
-- 可见, 在匿名块中的两条Insert语句是一个事务, 具有原子性
select * from t2;  -- 0

-- 另一种测试
/*
 * 例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 [email protected]_database set y = 10;
    commit;
    限制:
    1) 不能在数据库链接上发出commit, 例如 [email protected]_site
    2) 不能在数据库链接上完成ddl, ddl 会提交, 除了发起事务的站点外, 其他站点不能提交.
        (所谓发起事务站点, 比如有1,2,3三个站点, 而1是发出站点, 那么1会问2,3准备好提交没有, 如果准备好了, 1可以
         提交, 而此时网络中断, 那么2,3就会被挂起, 等待站点1的提交, 所以可见修改远端db还是很危险的)
    3) 不能在数据库链接上发出 savepoint

08 Transactions,布布扣,bubuko.com

时间: 2024-10-18 21:56:08

08 Transactions的相关文章

百度哈斯发卡号是减肥哈卡斯加分了卡斯

http://www.ebay.com/cln/ta_ya20/-/167521224015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398283011/2015.02.08 http://www.ebay.com/cln/ta_ya20/-/167521242015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398294011/2015.02.08 http://www.ebay.co

克同极用后管期果要议向中如极示听适VybVfesyhpR

社保划到税务征收,将大大提升社保费的征管效率.税务的征管能力是目前而言最强的,以后税务征收社保不是代收,属于本职了. 之前税局要把社保信息和交个税的工资比对起来有困难!现在好了,个税是自己的,社保也是自己的,比对困难?不存在的! 这一变革,会给那些不给员工上社保.不全额上社保的企业致命一击! 最新案例 前段时间的发改委关于限制特定严重失信人乘坐民航的一则意见--发改财金[2018]385号,其中还有税务总局的联合署名. http://weibo.com/20180408PP/2309279811

Spring JTA multiple resource transactions in Tomcat with Atomikos example--转载

原文地址:http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.html In this tutorial we shall show you how to implement JTA multiple resource transactions in a Tomcat server, using Atomikos Transac

Bootstrap 3.2.0 源码试读 2014/08/09

第一部分 normalize.css 104至110行 code,    /* 编辑代码 */ kbd,    /* 键盘输入的文本 */ pre, samp {    /* 范例,sample的简写 */   font-family: monospace, monospace;    /* 这个地方应该是写错了,第二字体应该是serif */   font-size: 1em; } 设置字体的大小为1em,字体为monospace. 111至119行 button, input, optgro

笔试算法题(08):输出倒数第K个节点

出题:输入一个单向链表,要求输出链表中倒数第K个节点 分析:利用等差指针,指针A先行K步,然后指针B从链表头与A同步前进,当A到达链表尾时B指向的节点就是倒数第K个节点: 解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* FindLastKth(Node *head, int k) { 6 if(head==NULL) { 7 printf("\nhead is NULL\n"); 8 exit(0); 9 } 10 Nod

android插件化-apkplug中OSGI服务基本原理-08

我们提供 apkplug 下OSGI使用demo 源码托管地址为 http://git.oschina.net/plug/OSGIService 一 OSGI与android Service 异同点 OSGI服务与android Service概念差不多也是Service ,Client 关系. android Service接口  --service.AIDL OSGI接口                --java interface 所以android 进程间通信Service只能传递序列

2014年4月23日 10:22:08

step 1 : 做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读取到的不是需要转换的对象,而是要直接根据字节流和协议来生成自己的数据对象. 按照之前的编程思维,总是请求然后响应,当然Socket也是请求和响应,不过与单纯的请求响应是不同的. 这里Socket连接往往是要保持住的,也就是长连接,然后设置一个缓冲区,网络流不断的追加到缓冲区.然后后台去解析缓冲区的字节流. http://cuisuqiang.iteye.com/blog/

java进阶08 GUI图形界面

图形化用户界面(GUI) 简而言之,就是可视化编程. 要想实现可视化界面(窗口),需要用到JFrame类. package Frame; public class JFrame1 { public static void main(String[] args){ UI ui=new UI(); } } 先建一个主函数,而主函数中的操作只有一句代码.这样做,既能直观又方便后期修改. 接下来是UI类的实现 package Frame; import javax.swing.JFrame; publi

2017/08/21 工作日志

今天先战略放弃了下拉列表的问题,但是后来在园子得到了一个答案,不过忘记去试验了,在家也无法测试,明天试着解决一下. 上午先把机构代码和地区代码的取值显示改了一下,然后将原来只在一个iframe里的弹框扩大到完整的页面,原理是把参照目标设为父窗口,这个之前也猜到了. 接着在改表头颜色的问题上耽误了一段时间.这里的问题是如果通过GridView自动生成数据,就不会有thead,这样就不能单独设置样式,解决的手段有几种,这里有篇帖子http://www.cnblogs.com/JavCof/archi