事务

事务

什么是事务?
事务是包含一个或多个SQL语句的逻辑的、原子的工作单元。事务将SQL语句分组,以便它们可以一起
被提交,即将其应用到数据库,或者一起被回滚,即将其从数据库中撤消。ORACLE数据库将为每个事务
分配一个称为事务ID的唯一标识符。

什么是事务的ACID属性?
原子性:事务中的所有任务,要么全部执行,要么都不执行。不存在部分完成的事务。例如,事务做删除
1000w条数据,结果完成了500w时出现故障,则数据库会回滚这500w行数据。
一致性:事务将会数据库从一个一致状态变为另一一致状态。例如:从张三的储蓄银行转账到李四的事务中,
故障一定不能导致数据库仅仅只更改一个账户的数据,这会导致数据不一致。
隔离性:一个事务必须在被提交后,其他事务才能看见效果。例如,正在更新scott.emp表的一个用户,不会
看到另个会话用户在emp表上未提交的更改。因此,对这些用户来说,这些事务好像是串行执行的。
持久性:已提交的事务所做的更改是永久性的。事务完成后,数据库通过其恢复机制,确保在事务中所做的更改
不会丢失。

事务从哪里开始?
事务开始于所遇到的第一个可执行SQL语句。可执行的SQL语句是能产生数据库实例调用的SQL语句,包括DML和DDL
语句,及SET transaction语句。
当事务开始时,Oracle数据库将为事务分配一个可用的撤销数据段,以记录新事物的撤消条目。数据库在第一个DML
语句过程中,首先会分配撤销段和事务表槽,然后分配事务ID
xid=xidusn+xidslot+xidsqn
SQL> select xid,xidusn,xidslot,xidsqn,status from v$transaction;
XID                  XIDUSN    XIDSLOT     XIDSQN STATUS
---------------- ---------- ---------- ---------- ----------------
020003009DF30000          2          3      62365 ACTIVE
那么事务结束于什么时候?
用户没有savepoint子句的语句中发出commit或rollback
用户运行一个ddl命令;数据库在每个DDL语句之前和之后发出一个隐式的commit语句
用户从大多数oracle数据库实例程序和工具正常退出,导致当前事务被隐式提交。当用户断开连接时的提交行为依
赖于应用程序,并且是可配置的。
客户端进程异常终止,导致数据库使用存储在事务表和撤销段中的元数据来隐式回滚事务。

事务控制语句
commit:语句结束当前用户,并使在事务中执行的所有更改都具有持久性。提交还会清除在事务中的所有保存点,并释
放事务锁。
rollback:语句将取消当前事务中所做的工作,他导致所有自上次提交或回滚以来的数据更改被丢弃。rollback to
savepoint 语句将撤消自上次保存点以来所做的更改,但不会结束整个事务。
savepoint:语句标识在事务中你可以稍后回滚到的点。

active事务
是已开始但尚未提交或回滚的事务。
在事务提交或回滚之前,事务对数据所做的更改是暂时的。在事务结束之前,数据状态如下分析:
1)、oracle数据库已在SGA中生成了undo段数据信息包含事务中的SQL 语句所更改的数据旧值
2)、已在SGA中online redo log中生成了重做信息。redo log记录里包含了data block和undo block
的更改
3)、已经对sga中buffers进行了修改;已提交事务所做的数据更改,存储在SGA的数据buffers中,但不一定
立即由数据库dbwr写入到数据文件。磁盘写入可能会在提交之前(例如大事务)或之后发生。
4)、数据更改所影响的行已被锁定。

savepoint干嘛的?
是事务上下文中的一个由用户声明的中间标记。在内部,此标记将被解析为一个SCN。保存点将长事务划分为多个
更小的部分。
如果你在一个长事务中使用保存点,则您就可以在之后将事务中执行的工作回滚到当前时间之前,却又在事务中声明
的某个保存点之后。因此,如果您错误,您不需要重新提交所有每个语句。

rollback a savepoint
在未提交事务中回滚到某个保存点,意味着该指定的保存点之后所做的任何更改都将被撤消,但它并不意味着事务本
身的回滚。

enquened transactions
取决于当时的场景,之前在等待被锁定资源的事务,在回滚到保存点后,可能仍处于阻塞状态。一个事务被另一个事
务阻塞时,它会在阻塞事务后面排队,因此整个阻塞事务必须提交或回滚,被阻塞的事务才能得以继续。

对未引用任何保存点的整个事务的回滚,Oracle 数据库执行下列操作:
1)、通过使用相应的undo段,撤消事务中所有SQL语句所做的所有更改
每个活动事务的事务表条目包含一个指向该事务的所有撤消数据 (与应用顺序相反)的指针。数据库从撤销段中读取
数据,反转其操作,然后将撤消条目标记为已应用。因此,如果一个事务插入行,则其回滚删除行。如果一个事务更新行,
则其回滚反转这个更新。如果一个事务删除一个行,则其回滚重新插入该行。
2)、释放由事务持有的所有数据锁
3)、清除在事务中的所有保存点
4)、结束事务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值