oracle学习笔记7:pl/sql事务

关于事务的举例,在之前有已经写过https://www.cnblogs.com/Zs-book1/p/10643516.html

事务的四大基本特性:

1.原子性:一系列的数据操作为一个整体,要么都执行,要么都不执行

2.一致性:事务完成前后,数据要保持一致的状态

3.隔离性:事务之间是相互独立的,隔离的

4.持久性:事务对数据的操作是永久的

事务的隔离级别:

隔离级别不同会引发一些不好的现象:

脏读:A事务正在执行,但是还没有提交,这是B事务读到了A事务过程中的事务

幻读:A事务将id=1的数据进行修改id=2,这是B事务需要操作id=1的数据。

重复读:A事务读取数据,B事务执行录入操作,这时A事务再次执行查询操作,读到的数据不一致

设置隔离级别:

1.未提交读:允许A事务读取B事务正在操作但是还没有提交的数据。

2.已提交读:默认的隔离级别;A事务必须等B事务提交后才能读取数据。

3.不可重复读:解决重复读的问题,A事务正在读取数据,不允许B事务操作数据。

4.序列化:串行化,事务排队进行,操作效率低。

在oracle中使用事务

在mysql中,默认事务是关闭的,但是在oracle中,事务默认是开启的,需要显示的提交事务或者回滚。

事务的操作命令:

commit;--提交
rollback ;--回滚
savepoint ;--设置保存点

事务控制语句:

set autocommit on|off|immediate;--在sqlplus命令行中执行
create table BANK
(
  ID    NUMBER(7),
  NAME  VARCHAR2(20),
  MONEY NUMBER(7)
    check (money > 0)--添加约束,钱数必须大于0
);
  --使用事务模拟转账业务
  declare
    begin
    update bank set money=money-1000 where name='zhangsan';
    update bank set money=money+1000 where name='lisi';
    commit;
    exception --当余额小于0时转账失败,回滚事务,不提交
    when others then
    rollback ;
  end;

还可以使用savepoint设置保存点

declare
  begin
  savepoint a; --设置保存点
  insert into bank values (3,'wanger',1000);
  savepoint b;
  insert into bank values (4,'zhao',1000);
  savepoint c;
  insert into bank values (5,'chen',1000);
  savepoint d;
  insert into bank values (6,'bai',1000);

  rollback to c;--回滚到保存点c
  commit ;--只提交保存点c之前的数据,保存点c之后的数据,回滚了,所以不提交
end;
原文地址:https://www.cnblogs.com/Zs-book1/p/11231772.html