Oracle事务

一:事务简介

ACID特性:
原子性Atomic
一致性Consistent
独立性Independent
持久性Durable

程序中每条SQL语句都会开启事务,当事务结束时,下一条SQL语句会自动开启另一个事务.

二:操作事务

SET TRANSACTION
START TRANSACTION
COMMIT
ROLLBACK
SAVEPOINT

注意:
一般不会同时使用set transaction和start transcation 因为设置的属性是一样的
savepoint能够标记当前事务的处理进度,一并使用rollback和savepoint就可以回滚部分事务

三:设置事务属性

SET TRANSACTION <mode>[,mode...][,USE ROLLBACK SEGMENT]

其中 use rollback segment 用于指定一个回滚段,回滚段用于存放数据修改之前的值
必须指定的mode是一种模式

两种模式:
1.访问级别:
2.隔离级别:isolation level

3.1访问级别

两个级别:
read only
read write
默认访问级别依赖于隔离级别
但是如果访问级别和隔离级别都没指定,那么默认访问级别就是 read write

设置方式: set transaction read only;

3.2隔离级别
 未提交读 read uncommitted
 已提交读 read committed
 重复读 repeatable read
 序列化 serializable

oracle的 set transaction 语句只支持两种隔离级别: read committed 和 serializable
默认是:read committed

设置方式: set transaction isolation level serializable

注意:隔离级别限制越多,对性能影响越大,只要隔离级别限制满足徐娅即可.

四:提交事务

自动提交的情况:
当执行DDL语句(alter,create,drop)
当执行DCL语句
当退出sql*plus

在oracle 11g中建议使用 set transaction name 语句为事务命名

SET TRANSACTION NAME '事务名称' ;
select ... from ...;
commit;

五:事务回滚

rollback
使用回滚两个原因
1.不小心误删数据
2.sql执行异常

在sql执行之前oracle会标记隐式的保存点,当语句执行失败就会自动执行回滚.

5.1设置事务保存点

savepoint

事务保存点 = 回滚点

事务保存点作用:
可以把一个长事务分割为较小的部分,然后结合rollback to 语句就可以恢复保存点标记的事务的部分每日,而不必恢复整个事务

begin 
     savepoint tmp_point;
     insert into ....;
exception when 异常 then
     rollback tmp_point;   --异常则回滚到保存点tmp_point
end;

5.2回滚事务事例

两种方式回滚:
1.回滚到指定事务点
1.ROLLBACK TO B;
2.EXEC DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(‘B’);

2.回滚所有事务
1.ROLLBACK 取消全部事务,会取消所有事务变化,结束事务,删除所有保存点
2.EXEC DBMS_TRANSACTION.ROLLBACK;

5.3终止事务

发生事务终止的情形:
1.一个用户提请一个没有savepoint 子句的commit 或 rollback语句
2.一个用户运行一个DDL语句,如果当前事务包含任何DML语句,oracle首先提交事务,然后作为一个新的单语句事务运行和提交DDL语句
3.体格用户从oracle断开,当前事务被提交
4.一个用户进行异常中断,当前会话被回滚
5.一个事务结束后,下一个可执行sql语句自动开始新事务

六:Oracle与SQL Server事务的区别

6.1事务设置以及类型的区别

sql server有三种事务类型: 自动提交事务/显示事务/隐式事务, 默认自动提交事务

6.11 自动体骄傲事务
sql server会为每条sql语句自动开始一个事务,然后自动提交,也就是说一个sql就是一个事务

6.1.2 显示事务
指在自动提交模式下,以begin tran 开始一个事务,以commit 或 rollback 结束一个事务,以commit结束事务是把事务中的修改永久化.

6.1.3 隐式事务
隐式事务是指在当前会话中用 SET IMPLICIT_TRANSACTION ON 命令设置的事务类型,任何DML语句都会开始一个事务,而事务结束也是commit 或 rollback

注意: 在Oracle中没有这些事务类型,默认下任何DML语句都会开启一个事务,直到commit/rollback操作.类似于sql server的隐式事务

6.2事务隔离级别

sql server的隔离级别有四种
read uncommitted
read committed
read rrepeatable
serialization

而oracle只有 read committed 和 serialization

区别:
1.oracle中读取和更新会同时进行,会话1跟新数据之前会把修改之前的结果存入回滚段/撤销段,然后进行更新操作,在会话1提交事务之前,会话2进行查询的时候会查询回滚段/撤销段的数据,而不会查询原表数据,避免脏数据
2.sql server 则会等待更新事务的结束再去读操作

6.3DDL语句对事务的影响

执行顺序
先会commit -> 执行ddl语句 ->错误则回滚 ->否则commit;

COMMIT;
...DDL语句
 IF ERROR THEN
     ROLLBACK;
ELSE
COMMIT;
END IF;

6.4用户断开连接数据库对事务的影响

首先:
1.Oracle 是 sql*plus
断开会自动commit;

2.sql server 是osql
断开会rollback

七:锁

使用 lock table 可以显性的锁定整张表
select for update 可以锁定表中的特殊行,保证他们在更新或删除之前不会发生改变
但是oracle在执行更新或删除的时候会自动获取行级锁 row-level locks

7.1使用 FOR UPDATE
DECLARE 
  CURSOR c1 IS 
     SELECT ...FROM ... FOR UPDATE NOWAIT; --锁定行

关键字 : NOWAIT 可以告诉Oracle如果请求行已经被其他用户锁定了那么不需要等待.控制权会马上还给我们程序以便在能够获取锁之前做一些其他操作,而如果没有关键字就会一直等带直到被锁定的行被释放.

7.2使用 LOCK TABLE

LOCK TABLE可以把整张表通过指定模式锁定,这样就能共享或者拒绝对这些表的访问了.

LOCK TABLE table IN ROW SHARE MODE NOWAIT;  --行共享锁模式

注意:
1.查询不会获取锁,只有不同事务尝试修改同样的数据才会出现事务等待其他事务完成
2.多个用户可以同时获取共享锁,但是只有一个用户可以获取排他锁

7.3提交后的数据取得

FOR UPDATE子句能够获取排他锁,打开游标时所有的行都会被锁住,在事务提交后锁会被释放.所以不能在事务提交后从使用了FOR UPDATE 的游标中获取数据,否则抛异常

八:时间戳

在数据表中有一列时间戳的数据列,当insert语句或update语句对数据进行修改时候,该列自动被修改成当前时间.

九:事务日志 : 主要用于故障恢复

事务日志 transaction log = 重做日志 redo log
事务日志主要记录了数据库中的每一个变化,日志包含的数据有已修改数据的前像 Undo , 和后像 Redo两种类型.
前像是操作前的数据副本,后像是操作后的数据副本.

Oracle数据库由两种类型的文件组成:
1.结合在一起构成表空间的数据文件
2.结合在一起构成重做日志系列的数据文件

Oracle数据库可以在下列两种模式下运行:
1.ARCHIVELOG 模式下将保存所有的事务日志
2.NOARCHIVELOG 模式下不保存旧事务日志
为了防止数据丢失,必须使用事务日志.

预写日志方式: 先写日志,再写磁盘

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值