ORACLE 事物TRANSACTION = COMMIT+ROLLBACK

事物 TRANSACTION = COMMIT + ROLLBACK 一组DML语句组合

ACID
原子性(Atomicity):事物必须是原子工作单元,事物里包含的一组sql语句要么全执行,要么全不执行
一致性(Consistency):事物完成时,所有数据都保持一致状态,即数据要改都改,保持数据完整性
隔离性(Isolation):两个事物的执行互不干扰
持久性(Durability):事物一旦提交,数据库的变化永久保存,不会因为系统故障丢失数据**

COMMIT:保存修改

declare 
dept_no number(2) := 70;
begin
  insert into emp values (66, 'QQQQ', 1000, '', null, null, null);--插入部门记录   第一条DML语句自动开启事物
insert into emp values (666, 'QQQQ', 1000, '', null, null, null);
 -- commit;--结束当前事物  数据修改永久写入数据库  对当前的锁定也自动解除
  end;

ROLLBACK:撤销操作、啥也没发生

begin
  insert into pandaa values (66, 'QQQQ', 1000,  null, null, 333333333333333);--隐式开启一个事物
  insert into pandaa values (666, 'QQQQ', 1000, null, null, 333333333333333);--pandaa表idNo有unique约束  所以这条插入语句会执行失败 触发异常
  commit;--结束当前事物  数据修改永久写入数据库  对当前的锁定也自动解除
  EXCEPTION      --异常处理
    when dup_val_on_index then 
    dbms_output.put_line(sqlerrm);--先输出错误信息
    rollback; --再回滚  即没有数据插入数据库
  end;

SAVEPOINT设置保存点
*1,保存点以后所做的更改都被撤销、但是保存点未释放
2,保存点以后sql所需要的锁和资源都被释放
3,并未结束整个事物,事物仍处于挂起状态*

 begin
    savepoint a ;--相当于整个rollback  没啥用
  insert into pandaa values (66, 'QQQQ', 1000,  null, null, 333333333333335);--隐式开启一个事物  a 
  savepoint b ;--a语句下的所有语句被回滚
  insert into pandaa values (666, 'QQQQ', 1000, null, null, 333333333333334);--pandaa表idNo有unique约束  所以这条插入语句会执行失败 触发异常   b
  savepoint c;--b语句下的sql被回滚
 insert into pandaa values (666, 'QQQQ', 1000, null, null, 333333333333335); --c
 commit;--结束当前事物  数据修改永久写入数据库  对当前的锁定也自动解除
  EXCEPTION      --异常处理
    when dup_val_on_index then 
    dbms_output.put_line(sqlerrm);--先输出错误信息
    rollback to savepoint c; --执行到c语句时违反约束条件触发异常、回滚到c保存点,即语句a  b插入成功,语句c执行失败
  end;--此时整个事物还是挂起状态 没有提交

SET TRANSACTION 设置事物属性 必须是事物处理的第一条语句 且仅出现一次
1.set transaction read only;–只读事物 执行update 、delete、insert、select for update都是非法操作
2.set transaction read write;–读写事物
3.set transaction isolation level serializable ;–序列隔离级别
4.set transaction isolation read committed;–提交隔离级别


declare 
a number(2);
b number(2);
c number(3);
begin
  commit;--首先进行一个可选的commit提交  确保set transaction 为事物中第一条语句
  set transaction read only name '嘎嘎';--使用name为事物命名    设置只读状态
  select count(plan) into a from pandaa where plan ='1';
  select count(plan) into b from pandaa where plan ='2';
  select count(plan) into c from pandaa where plan ='3';
  commit; --终止只读事物
  dbms_output.put_line('嘎嘎'||a);
  dbms_output.put_line('嘎嘎'||b);
  dbms_output.put_line('嘎嘎'||c);
  end;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值