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;