ORACLE事务基本概念

1,引出事务的概念:
 两个客户端1,2 访问数据库同一张表  表中有18条数据
 现象:
 1客户端删除表中一条数据  但是没有提交 commit,这个时候1客户端查询数据有17条数据,而2客户端查询还有18条数据
 如果1客户端commit之后, 在查询2客户端也变成了17条数据
 为什么要提交一下?
 数据库往往把一系列的对数据库的操作(dml)看做一个整体,要么全部成功,要么全部失败。这样现象就称为事务。
 事务具有原子性。
 典型事例:银行转账,利用事务可以保证数据的完整性
 在对表进行事务操作的时候,oracle会在该表上加上一把锁,防止其他用户修改表的结构
 当执行了commit语句之后,会确认事务的变化,结束事务,删除保存点,释放锁。其他会话可以查看事务变化后的数据。

2,事务的隔离级别:定义事务与事务之间的隔离程度
 隔离级别      脏读      不可重复读    幻读
 
 读未提交     会出现      会出现       会出现
 读已提交     不出现      会出现       会出现
 可重复读     不出现      不出现       会出现
 可串行化     不出现      不出现       不出现
 
 不同数据库厂商有不同的实现,上面只是定义了一个标准
 
 脏读:当一个事务读取到另一个事务尚未提交的数据,称为脏读,oracle数据库不会出现脏读的情况
 
 不可重复读:在同一个事务的同一个查询结果受到了另一个事务的修改或删除的影响。就出现了不可重复读
 例如:财务报表以某时某分为界限来进行统计的。
 
 幻读:在同一个事务的同一个查询,如果因为别的事务添加造成本事务查询的结果不一致,这个现象称为幻读。
 
 oracle的事务隔离级别只有三种:
 ANSI/ISO SQL规定了四种事务隔离级别,分别是:read uncommitted,read committed,repeatable       read,serializable

 ORACE提供了SQ92标准中的read committed和seriaizabe,同时提供了非SQ92标准的read-ony。

 read committed:

    这是ORACE缺省的事务隔离级别。
    事务中的每一条语句都遵从语句级的读一致性。
    保证不会脏读;但可能出现非重复读和幻像。

 seriaizabe:(串行执行事务,并发性最小)

    简单地说,seriaizabe就是使事务看起来象是一个接着一个地顺序地执行。
    仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。
    保证不会出现非重复读和幻像。
    Seriaizabe隔离级别提供了read-ony事务所提供的读一致性(事务级的读一致性),同时又允许DM操作。

 如果有在seriaizabe事务开始时未提交的事务在seriaizabe事务结束之前修改了seriaizabe事务将要修改的行并进行了提交,则seriaizabe事务不会读到这些变更,因此发生无法序列化访问的错误。(换一种解释方法:只要在seriaizabe事务开始到结束之间有其他事务对seriaizabe事务要修改的东西进行了修改并提交了修改,则发生无法序列化访问的错误。)

 read-ony:

    遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。
    不允许在本事务中进行DM操作。
    read ony是seriaizabe的子集。它们都避免了非重复读和幻像。区别是在read ony中是只读;而在seriaizabe中可以进行DM操作。
    Export with CONSISTENT = Y sets the transaction to read-ony.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章