oracle事务由来,特点及控制方式

事务的由来:

       我们用ATM转账的体验,可以用这个概念来理解:

       如果用户A要给用户B从银行转账10000元,此时我们考虑ATM机的行为,把ATM机的行为作为一个事务。

(1)从用户A的账户减少1000元。

(2)向用户B的账户增加1000元。

        上述两个步骤必须都成功执行,如果两个步骤任何一个出现问题,我们说ATM机没有正确完成这次转账行为。谁也不希望在自己的账户上拜拜丢失10000元吧。此时ATM机的两个执行步骤是不可分割行为,要么执行成功,要么不执行(回滚所有更改的数据),ATM及的两个操作在逻辑上可以看做一个完整的事务。

 

什么是事务:

        事务是一组逻辑工作单元,它由一条或多条SQL语句组成。一个事务可以在操作的数据库对象上执行一个或多个操作,事务可以作为程序的部分功能而执行。事务开始于一条可执行的SQL语句,继续执行事务主体,然后结束于以下的一种情况。

(1)显示提交commit: 当事务遇到commit指令时,将结束事务并永久保存所有更改的数据到数据文件中。

(2)显示回滚rollback: 当事务遇到rollback指令时,也结束事务的执行,但是此时它回滚所有更改的数据到其原始值,即取消所有更改。

(3)DDL语句: 一旦用户在使用数据定义语言时,如CREATE,DROP等,则之前的所有DML语言操作都作为事务的一部分而提交,此时称为隐式提交。

(4)正常程序结束: 如果oracle数据库应用程序正常结束,如使用SQL*Plus工具更改了数据,而正常退出该工具程序,则ORACLE自动提交事务。

(5)非正常的结束程序: 当程序崩溃或意外终止时,所有数据更改都被回滚,类似于显示回滚操作的结果,这里是隐式回滚的,因为没有用户参与。

 

 

事务的特点:

简称为ACID:

(1)原子性(atomicity):事务要么执行成功,要么什么也不执行,如果事务执行了一部分而系统崩溃或发生异常,则oracle将回滚所有更改的数据,此时oracle使用还原段管理更改数据的原始值用户事务回滚。

(2)一致性(consistency):事务必须保持数据库在一直状态,如在scott用户的dept表中删除一条记录,但是emp表中存在雇员属于要删除的部分,那就拒绝这样的操作执行。

(3)隔离性(isolation):隔离性使得多个用户隔离执行实现数据库的并发访问这种隔离性要求一个事务修改的数据在未提交前,其他事务看不到他所做的更改,oracle使用并发控制机制实现事务隔离性。

(4)持久性(durability):该特性保证提交的事务永久性地保存在数据库中,在oracle数据库中提交的数据并不是立即写入到数据文件,而是先写入到重做日志文件,即使实例崩溃也可以在实例恢复,保证事务持久性。

 

事务控制实验

(1)使用commit的显示事务控制

--查看dept表的内容

--删除dept表中的一条记录

--但是并没有提交

此时,提示已经删除了DEPTNO=40的记录,但是此时无论是显示和隐式我们都没有提交数据更改,所以其他用户不应该看到我们更改后的数据,及其他用户仍然会看到DEPTNO=40的记录。下面截图就是

 

--此时再使用另一个session去访问,查看表中的数据

正如我们预料,开启另一个session,去查看记录,会发现已经更改的在未提交前我们是看不到的,这也是oracle事务隔离性的体现。下面我们看看提交后的效果。

 

--进行显示提交操作

此时提交完成,追忆提交后的更改的数据可能还没有写入到数据文件,但是由于重做日志的保护,不影响事务持久性。我们来验证其他session连接能不能看到提交后的结果。下面如下

 

--再次查看,将会看到dept表中的数据已经删除掉了。

      在用户提交更改后,我们用其他的session或者是其他的用户登录数据库,此时可以看到事务提交了数据更改,所以其他用户看到的是更改后的数据,DEPTNO=40已经删除成功了。

        用户显示的提交commit来提交事务,完成事务的持久性,那么当显示commit提交前后oracle到底做了哪些工作呢?

commit提交前oracle内部发生的行为:

(1)在非系统还原段中生成要更改的数据备份

(2)在重做日志缓冲区创建重做日志选项

(3)在数据库高速缓冲区修改数据(删除或更新)

commit提交后oralcle内部发生的行为:

(1)在重做记录的事务表中标记上已经提交事务的scn,说明该事务已经提交了。

(2)LGWR将事务的重做日志信息和已提交的事务的scn号写入重做日志文件。此时,认为提交完成了。

(3)释放oracle持有的对更改的数据对象的锁,标记事务完成。

 

 

(2)使用rollback实现事务控制

(3)程序异常退出对事务的影响

此时不提交,我们将xshell手工退出。

我们再用system用户去查看刚才是不是已经提交了

显然没有进行提交。程序意外关闭,将不进行提交。

 

(4)程序正常关闭的时候是否提交

提交完后,我们正常退出了。

再次连接查看一下数据。

我们看完数据后发现,正茬的退出是带有隐式提交的。

(5)使用AUTOCOMMIT实现事务的自动提交

自动提交后,事务已经结束,rollback是没有用的。

 

总结:

要深刻理解事务的四个特性:

ACID

 

      事务控制使得用户更加自由地控制事务行为,oracle模式处于非自动提交模式,即用户事务中执行了DML操作后并不是提交该数据,而是需要用户显示或隐式的提交数据更改。在没有提交数据更改时,rollback指令可以使得事务回滚。另外在oracle程序非正常退出或驶离崩溃时,事务会自动回滚,如果程序正常退出,事务隐式提交。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NARISU_JIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值