关于Oracle11g的了解——事务

事务

重要性:

关于事务,不得不说它在oracle中占据了重要的地位。

概念:

从概念来讲,它包含一组数据库命令,构成单一逻辑工作单元的操作集合;是访问并可能更各种数据项的一个程序执行单元,是不可分割的工作逻辑单元;是并发操作的最小控制单位。
简单来说,事务是一组DML语句和commit/rollback组成,是改变数据最小逻辑单元;如果是commit,表示数据入库,如果是rollback,表示取消所有的DML操作。

特性:

事务有四个特性,分别是原子性,一致性,隔离性和持久性。

原子性:事务处理完成,所有的工作都么在数据库中全部保存;要么就全部回滚,都不保留。

一致性:事务完成或撤销后,都应该处于一致的状态。
隔离性:多个事务同时运行,互不干扰。它是用来防止一个事务处理其他事务也要修改的数据时,不合理地存取和不完整的读取数据。
持久性:一旦事务提交了,它就是永久的。

但是在事务并发处理会产生问题:
丢失更新:
当两个或多个事务选定同一行,会基于最初选定的值更新这一行,会导致丢失更新,由于事务的隔离性,事务之间都不知道对方的存在,所以在重写其他事务所做的更新时,就会导致数据丢失。
比如:有一个仓库,库存有100,现在有两个事务:T1进货400,T2出货50。这时事务的执行顺序:1.T1读取了库存为100;2.T2也读取了库存是100;3.T1进货了就加上了400;4.这时,T2出货了50;5.T1写库存为500;6.而T2却记录的是50。这就在第五步T1写的时候造成了丢失。
正常的应该是当T1全部执行完后,T2最初读取的库存是500的时候,才会造成数据正常。

脏读:

其中还会得到一个概念叫做脏读。可以这样理解:当第二个事务选择娶她事务正在更新的行时,会发生为确认的相关性问题;或第二个事务正在读取的数据还没确认并且可能由更新此行的事务所更改。
比如:库存100,有两个事务:T1购入400,在没提交前撤销了该操作,而这时T2 卖出了50。由于T2读取的是为提交的事务,而如果T1回滚了,这时T2就在继续执行,写在库存的数量就是450,造成了脏读。正常的应该是T1写入库存的时候就进行回滚,这样T2读取的库存是100,就不会造成脏读。

组成:

事务是由以下部分组成:
1.一个或多个DML语句
2.一个DDL语句
3.一个DCL语句
首先它是由第一个DML语句的执行开始,由以下的其中之一作为结束:
1.commit/rollback
2.DDL或DCL(自动提交)
3.用户会话正常结束
4.系统异常终止

事务控制:

commit:

在oracle中,在内存中将为每个用户提供一个工作区,客户机对数据库的操作处理都在工作区里完成,只有输入commit后,在工作区中修改的内容才会写入数据库中,称为物理输入.
这样保证任意客户机在没有物理提交修改以前,其他的客户机读取的后台数据库中的数据库是完整的,一致的.

rollback:

oracle为了适应事务控制设置了回滚段这一数据库对象,系统利用回退段来确保如读一致性、数据库恢复等管理功能;oracle在缺省情况下,读数据不加锁,通过回退段保证用户不读脏数据和可重复读。
注意:回退段可以由用户创建,但只能有系统进程使用。

自动提交事务:

当执行DDL语句时会自动提交事务
当执行DCL语句时(grant revoke)
当退出sqlplus时

事务设为只读:

set transaction read only
当事务设为只读后,不生成回滚,在整个事务中就不能修改操作
但可以通过rollback取消设定。

只读事务:

只读只能执行查询操作,不能进行任何DML语句操作
当使用只读事务可以确保取得特定的时间点的数据
比如:需要在12点的时候记录某一个信息而不管12点以后的信息,就可以用只读事务

控制事务:


回滚到保留点:

使用savepoint语句可以在当前事务中创建保存点
使用rollback语句回滚到创建的保存点

当会话异常结束或系统异常会导致自动回滚

这是我所整理的关于事务方面的东西,如有不好的地方,还请指出,本人不胜感激
两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更新将

重写由其它事务所做的更新,这将导致数据丢失。当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存的更新将重写由其它事务所做的更新,这将导致数据丢失。

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。,这将导致数据丢失。

当两个或个事务选择同行

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致

发布了37 篇原创文章 · 获赞 3 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章