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;