运用事务

1、什么是事务?

了解:Oracle默认是将数据先在内存中删除,如果执行commit,则在磁盘上删除;
      如果执行rollback,则删除动作取消。
commit相当于存盘;rollback相当于撤销。
     
2、执行多条sql,能不能commit一部分,rollback一部分?


事务:
1、提交和回滚起什么作用?
2、先commit后rollback

修改节点名称


SELECT COUNT(*) FROM emp WHERE deptno=10;

--案例
CREATE TABLE bank(
ID NUMBER PRIMARY KEY,
money NUMBER);
INSERT INTO bank VALUES(1,1000);
INSERT INTO bank VALUES(2,0);
COMMIT;

--问题:卡1的钱是否会减少
BEGIN
  update bank set money=money-500 where id=1;
  update bank set money='xxx' where id=2;
  COMMIT;
END;


--案例2
DECLARE
  v_money bank.money%TYPE;
BEGIN
  update bank set money=money-200 where id=1; --500,200

 update bank set money=money+200 where id=2
 RETURNING money INTO v_money;
  --如果卡2的金额超过300块,要回滚;否则要提交
  IF v_money>=300 THEN
     ROLLBACK;
  ELSE
     COMMIT;
  END IF;
END;
--演示:两个账号要么都不改,要么都改。


--分析:将多个sql放在事务中
BEGIN
  --当执行第一个sql(增删改)时,事务自动开始
 update bank set money=money-100 where id=1;
 update bank set money=money+100 where id=2;
 COMMIT;
 ROLLBACK;--现在有没有效果?
END;

SELECT * FROM bank;
分析:
 COMMIT; --事务提交,代表本事务结束(写了磁盘)。
 ROLLBACK;--另一个新的事务直接结束。
事务的特性:一旦提交或回滚,事务就结束(就当这个事务从来发生过)。
所以不能在commit以后再rollback,真正的原因数据库已经不知道刚才是什么事务。
要恢复刚才修改的数据,只能重新启动一个事务。

 


DECLARE
  v_money bank.money%TYPE;
BEGIN
  update bank set money=money-100 where id=1; --500,200

 update bank set money=money+100 where id=2
 RETURN money INTO v_money; --将内存中更改结果赋值给变量(returning)
 dbms_output.put_line(v_money);
  IF v_money>=300 THEN
     ROLLBACK;
  ELSE
     COMMIT;
  END IF;
END;

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值