oracle事务学习与笔记

1、 什么是事务 

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 

原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 

一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。 

隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。 

持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。 

2、事务级别
隔离级别                            脏读          不可重复读       幻像读
READ UNCOMMITTED(读未提交)        允许          允许             允许
READ COMMITTED(读已提交)          不允许        允许             允许
REPEATABLE READ(可重复读)         不允许        不允许           允许
SERIALIZABLE(可串行化)            不允许        不允许           不允许

隔离级别解释:
脏读(dirty read):当一个事务读取另一个事务未提交的修改时,产生脏读。
不可重复读(nonrepeated read):同一查询在同一事务中多次进行,由于其他事务提交所做的修改或删除,导致每次返回的结果不同,此时发生不可重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他事务提交所做的插入操作,每次发生的不同的结果集,此时发生幻读。

Oracle的事务隔离级别:
Oracle提供read committed和serializable,并提供了一个非SQL标准的read-only级别。

已提交读取(read committed)    
Oracle默认使用的事务隔离级别。事务内执行的查询只能看到查询执行前(而非事务开始前)就已经提交的数据。Oracle的查询永远不会读取脏数据(未提交的数据)。

Oracle不会阻止一个事务修改另一事务中的查询正在访问的数据,因此在一个事务内的两个查询的执行间歇期间,数据有可能被其他事务修改。举例来说,如果一个事务内同一查询执行两次,可能会遇到不可重复读取或不存在读取的现象。 
 
串行化(serializable)    
串行化隔离的事务只能看到事务执行前就已经提交的数据,以及事务内 INSERT , UPDATE ,及 DELETE语句对数据的修改。串行化隔离的事务不会出现不可重复读取或不存在读取的现象。 
 
只读模式(read-only)    
只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行 INSERT , UPDATE ,及 DELETE 语句。

设置一个事务的隔离级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;

设置单个会话的隔离级别:

ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;

查看会话锁级别:

SELECT s.sid, s.serial#,
  CASE BITAND(t.flag, POWER(2, 28))
    WHEN 0 THEN 'READ COMMITTED'
    ELSE 'SERIALIZABLE'
  END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');


3、 事务的控制 

oracle没有“开始事务”的语句,事务隐式地开始于第一条修改数据的语句,并以commit或rollback语句显式的结束事务。一条语句要么完全执行,要么完全回滚,一条语句的失败不能使它前面执行的语句自动回滚。 

事务控制语句:commit,rollback,savepoint,rollback to <savepoint>
set transaction:设置不同的事物属性,例如隔离等级和是否只读或可读写,也可以使用此语句来指示事务使用某个特定的回滚段。 

COMMIT是事务提交命令。 

ROLLBACK是事务回滚命令,在尚未提交commit命令之前,如果发现delete、insert和update等操作需要恢复的话,可以使用rollback命令回滚到上次commit时的状态。 

SAVEPOINT是保存点命令。事务通常由数条命令组成,可以将每个事务划分成若干个部分进行保存,这样每次可以回滚每个保存点,而不必回滚整个事务。语法格式如下。
创建保存点:savepoint 保存点名;
回滚保存点:rollback to 保存点名; 


4、sqlplus中事务提交方式
显示commit;
通过autocommit 参数设置事务的自动提交方式, show autocommit查看事务提交方式,set autocommit on--开启sqlplus 中的自动提交功能。
退出sqlplus 的时候提交或者回滚事务,如果使用exit 或者quit 命令友好的提出sqlplus 未提交的事务将会被自动的提交;如果异常的退出sqlplus 未提交的事务将会被回滚掉,比如直接叉掉sqlplus。


参考资料:
https://blog.csdn.net/leozhou13/article/details/50449965
https://www.cnblogs.com/Cilimer/p/4192712.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值