本章提要
------------------------------------------
事务的特性
事务控制语句
------------------------------------------
事务, 把数据库从一种一致状态转变为另一种一致状态.
事务的特性:
    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的更多相关文章

  1. 事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)

    1:本地事务DbTransaction和分布式事务TransactionScope的区别: 1.1:System.Data.Common.DbTransaction: 本地事务:这个没什么好说了,就是 ...

  2. 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 ...

  3. 如何避免误用分布式事务(System.Transactions.TransactionScope)

    以下内容来源与:http://www.cyqdata.com/cyq1162/article-detail-54453 1:本地事务DbTransaction和分布式事务TransactionScop ...

  4. Fragment Transactions & Activity State Loss

    转自:http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html The foll ...

  5. LOCK TABLES和UNLOCK TABLES与Transactions的交互

    LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...

  6. iOS系列 基础篇 08 文本与键盘

    iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...

  7. javaEE基础08

    javaEE基础08 一.继承 特点:继承父类的属性和方法,单继承(多继承) 特性:方法的复写(重写) 比如:人可以养狗 人------>狗:整体和部分(拥有)关系 关键字:extends 结构 ...

  8. The Myths about Transactions (ACID) and NoSQL

    There has been widespread characterization of one of the major distinctions between NoSQL and tradit ...

  9. 【玩转单片机系列001】 08接口双色LED显示屏驱动方式探索

    前些日子,从淘宝上购得一块08接口的双色LED显示屏(打算做个音乐频谱显示器),捣鼓了好几天,终于搞清楚了其控制原理,在这里做个总结,算是备忘吧. 1.LED显示屏的扫描方式 LED显示屏的扫描方式有 ...

随机推荐

  1. js闭包的产生

    当函数可以记住并访问所在的词法作用域, 即函数是在当前词法作用域之外执行, 这时就产生了闭包. function a () { function b () {   //函数b的词法作用域是在函数a内 ...

  2. mysql5.5.x升级到mysql5.6.x

    大概步骤是: 把配置文件添加:skip-grant-tables参数,把basedir升级成新版本,启动mysql,执行命令:mysql_upgrade升级一下字典信息,然后flush privile ...

  3. hibernate 对应关系级联的意思

    hibernate的关联关系,重点在理解级联cascade和inverse 1.cascade一般用在级联保存,级联更新,级联删除上 1.1cascade注解有两种,一种是基于hibernate注解 ...

  4. ubuntu-E:Encountered a section with no Package: header的解决办法

    刚才打开ubuntu,我的版本是12.04.正想使用sudo apt-get install build-essential 时,出现了如下错误: E:Encountered a section wi ...

  5. 【转】MYSQL入门学习之六:MYSQL的运算符

    转载地址:http://www.2cto.com/database/201212/175862.html 一.算术运算符 1.加  www.2cto.com           mysql> s ...

  6. Y2K Accounting Bug 分类: POJ 2015-06-16 16:55 14人阅读 评论(0) 收藏

    Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11222   Accepted: 56 ...

  7. Opencv中直线的表示方法

                               [blog算法原理]Opencv中直线的表示方法  一.问题的提出:​          在实际项目编写过程中,需要对直线(Line)进行特定的处 ...

  8. MSSQL删除字段时出现 服务器: 消息 5074,级别 16,状态 1,行 1 的解决办法

    有的朋友在做用户维护字段的界面时,肯定发现一个问题,当用脚本:ALTER TABLE 表名 DROP COLUMN 字段名进行删除字段的操作时,会出现“服务器: 消息 5074,级别 16,状态 1, ...

  9. [C语言](*p)++与 ++(*p)与 *p++ 与 ++*p

    首先亮明个人观点,不要认为这样写都算写的不好,还强调大神一般不写这种代码,可读性不高 其实是你的C语言基础太差,读不懂,大神还真的就是这么写的.可以看看C语言库函数中的一些写法 *P++ :*和++都 ...

  10. BZOJ 3144 切糕(最小割)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3144 题意: 思路:我们假设没有那个D的限制.这样就简 单了.贪心的话,我们只要在每一个 ...