Oracle11g第06讲事务及锁_第1页
Oracle11g第06讲事务及锁_第2页
Oracle11g第06讲事务及锁_第3页
Oracle11g第06讲事务及锁_第4页
Oracle11g第06讲事务及锁_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、事务事务目标目标通过本章学习,您将可以通过本章学习,您将可以:使用使用 DML 语句语句向表中插入数据向表中插入数据更新表中数据更新表中数据从表中删除数据从表中删除数据将表中数据和并将表中数据和并控制事务控制事务事务概念事务概念包含一组数据库命令,构成单一逻辑工包含一组数据库命令,构成单一逻辑工作单元的操作集合作单元的操作集合访问并可能更新各种数据项的一个程序访问并可能更新各种数据项的一个程序执行单元,是不可分割的工作逻辑单元执行单元,是不可分割的工作逻辑单元执行并发操作的最小控制单位执行并发操作的最小控制单位事务的特性事务的特性原子性(原子性(AAtomicity)一致性(一致性(CCons

2、istency)隔离性(隔离性(IIsolation)持久性(持久性(DDurability)原子性、原子性、一致性一致性原子性原子性: :就是事务应作为一个工作单元就是事务应作为一个工作单元, ,事务处理完成事务处理完成,所有的工作要么都在数据库中保存下来,要,所有的工作要么都在数据库中保存下来,要么完全回滚,全部不保留么完全回滚,全部不保留一致性一致性: :事务完成或者撤销后,都应该处于一致的状态事务完成或者撤销后,都应该处于一致的状态隔离性、永久性隔离性、永久性隔离性隔离性多个事务同时进行,它们之间应该互不干扰多个事务同时进行,它们之间应该互不干扰. .应该防止一个事务处理其他事务也要修

3、改的数应该防止一个事务处理其他事务也要修改的数据时,不合理的存取和不完整的读取数据据时,不合理的存取和不完整的读取数据永久性永久性事务提交以后,所做的工作就被永久的保存下事务提交以后,所做的工作就被永久的保存下来来事务并发处理会产生的问题事务并发处理会产生的问题 丢失更新丢失更新当两个或多个事务选择同一行,然后基于最初当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数新将重写由其它事务所做的更新,这将导致数

4、据丢失。据丢失。丢失更新:丢失更新:假设产品的当前库存假设产品的当前库存60,现有两个事务:,现有两个事务:T1购入购入400个,个,T2卖出卖出40顺序顺序事务事务步骤步骤存储的值存储的值1T1读在库数量读在库数量602T2读在库数量读在库数量603T1在库数量在库数量=60+4004T2在库数量在库数量=60-405T1写在库数量写在库数量460(将被丢失)(将被丢失)6T2写在库数量写在库数量20正常执行过程:正常执行过程:假设产品的当前库存假设产品的当前库存60,现有两个事务:,现有两个事务:T1购入购入400个,个,T2卖出卖出40顺序顺序事务事务步骤步骤存储的值存储的值1T1读在库

5、数量读在库数量602T1在库数量在库数量=60+4003T1写在库数量写在库数量4604T2读在库数量读在库数量4605T2在库数量在库数量=460-406T2写在库数量写在库数量420脏读脏读 当第二个事务选择其它事务正在更新的行时,当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。会发生未确认的相关性问题。 第二个事务正在读取的数据还没有确认并且可第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。能由更新此行的事务所更改。T2使用使用T1未提交数据:未提交数据:假设产品的当前库存假设产品的当前库存60,现有两个事务:,现有两个事务:T1购入购入400个,在没

6、有提交前撤消了该操作,个,在没有提交前撤消了该操作,T2卖出卖出40顺序顺序事务事务步骤步骤存储的值存储的值1T1读在库数量读在库数量602T1在库数量在库数量=60+4003T1写在库数量写在库数量4604T2读在库数量读在库数量460(读未提交数据)(读未提交数据)5T2在库数量在库数量=460-406T1rollback606T2写在库数量写在库数量420正常执行过程:正常执行过程:假设产品的当前库存假设产品的当前库存60,现有两个事务:,现有两个事务:T1购入购入400个,在没有提交前撤消了该操作,个,在没有提交前撤消了该操作,T2卖出卖出40顺序顺序事务事务步骤步骤存储的值存储的值1

7、T1读在库数量读在库数量602T1在库数量在库数量=60+4003T1写在库数量写在库数量4604T1RollBack605T2读在库数量读在库数量606T2在库数量在库数量=60-407T2写在库数量写在库数量20脏读脏读会话会话AUpdate emp set sal=2000 where ename=SCOTT;会话会话BSelect sal from emp where ename=SCOTT;数据库事务数据库事务数据库事务由以下的部分组成数据库事务由以下的部分组成:一个或多个一个或多个DML 语句语句一个一个 DDL 语句语句一个一个 DCL 语句语句数据库事务数据库事务以第一个以第一

8、个 DML 语句的执行作为开始语句的执行作为开始以下面的其中之一作为结束以下面的其中之一作为结束:COMMIT 或或 ROLLBACK 语句语句DDL 或或 DCL 语句(自动提交)语句(自动提交)用户会话正常结束用户会话正常结束系统异常终了系统异常终了打开事务的自动提交打开事务的自动提交show autocommitset autocommit on;Commit事务提交命令。事务提交命令。在在OracleOracle中,在内存中将为每个客户机建立工作区,客中,在内存中将为每个客户机建立工作区,客户机对数据库进行操作处理的事务都在工作区内完成,户机对数据库进行操作处理的事务都在工作区内完成,

9、只有在输入只有在输入commitcommit命令后,工作区内的修改内容才写入命令后,工作区内的修改内容才写入到数据库上,称为物理写入到数据库上,称为物理写入. .这样可以保证在任意的客户机没有物理提交修改以前,这样可以保证在任意的客户机没有物理提交修改以前,别的客户机读取的后台数据库中的数据是完整的、一致别的客户机读取的后台数据库中的数据是完整的、一致的的. .COMMIT和和ROLLBACK语句的优点语句的优点使用使用COMMIT 和和 ROLLBACK语句语句,我们可以我们可以: 确保数据完整性。确保数据完整性。数据改变被提交之前预览。数据改变被提交之前预览。将逻辑上相关的操作分组。将逻辑

10、上相关的操作分组。当执行了当执行了Commit语句之后,会确认事务变化、结束事语句之后,会确认事务变化、结束事务、删除保存点、释放锁。当使用务、删除保存点、释放锁。当使用commit语句后,其语句后,其他会话将可以看到事务变化后的新数据他会话将可以看到事务变化后的新数据ORACLEORACLE事务控制事务控制- -回退段回退段ORACLE为了适应事务控制设置了为了适应事务控制设置了回退段这一数据库对象这一数据库对象.系统利用回退段来确保诸如读一致性、数据库恢复等管理系统利用回退段来确保诸如读一致性、数据库恢复等管理功能。功能。ORACLE在缺省情况下在缺省情况下,读数据不加锁读数据不加锁,通过

11、回退段通过回退段(Rollback Segment)保证用户不读脏数据和可重复读保证用户不读脏数据和可重复读.表空间中的数据按段来组织表空间中的数据按段来组织,数据段、索引段、暂存段和回数据段、索引段、暂存段和回退段,回退段是一块磁盘存储区域,退段,回退段是一块磁盘存储区域,回退段可以由用户创建,但只能由系统进程使用。,但只能由系统进程使用。ORACLEORACLE事务控制事务控制- -回退段回退段事务的执行过程(采用日志和回退段双重记录事务活动):事务的执行过程(采用日志和回退段双重记录事务活动):进入回退段进入回退段, ,写入回退信息写入回退信息从数据段读入缓冲区从数据段读入缓冲区, ,S

12、QLSQL处理处理记载日志文件记载日志文件提交提交, ,写更改结果到磁盘写更改结果到磁盘 回退回退, ,写回退信息到磁盘写回退信息到磁盘 事务第一条更新语句事务第一条更新语句事务结束事务结束NYUpdate t set col=0 where col=123;commit;数据库首先把该语句的整个操作包括数据数据库首先把该语句的整个操作包括数据0与与123写入日志缓冲区写入日志缓冲区然后把然后把123和一些信息写入回滚段,和一些信息写入回滚段,最后把最后把0修改到数据缓冲区。修改到数据缓冲区。当发出提交命令时,如果日志缓冲区内容没有写入日志当发出提交命令时,如果日志缓冲区内容没有写入日志文件则

13、必须写入日志文件,回滚段把该事务标记为已经文件则必须写入日志文件,回滚段把该事务标记为已经提交,数据缓冲区中的这个事务也标记为已提交提交,数据缓冲区中的这个事务也标记为已提交如果回退这个事务,则数据库将回滚段中如果回退这个事务,则数据库将回滚段中123读出写回读出写回数据缓冲区,这个回退变化也被写入日志文件。数据缓冲区,这个回退变化也被写入日志文件。自动提交事务自动提交事务当执行当执行DDL语句时会自动提交事务,语句时会自动提交事务,当执行当执行DCL语句(语句(grant revoke)当退出当退出SQL*Plus时时将某一事务设为只读事务将某一事务设为只读事务Set transaction

14、 read only只读事务,不生成回滚信息,在整个事务中就不能有修只读事务,不生成回滚信息,在整个事务中就不能有修改操作改操作注意是针对当前事务,不是另一个事务注意是针对当前事务,不是另一个事务Set transaction read only | read write通过通过rollback取消设定。取消设定。只读事务只读事务只读事务只允许执行查询操作,而不允许执行任何只读事务只允许执行查询操作,而不允许执行任何DML操作事务。操作事务。当使用只读事务可以确保取得特定的时间点的数据。当使用只读事务可以确保取得特定的时间点的数据。例如:例如:假定企业需要在每天假定企业需要在每天16点统计最近

15、点统计最近24小时的销售信息,小时的销售信息,而不统计当天而不统计当天16点之后的销售信息,那么用户可以使用点之后的销售信息,那么用户可以使用只读事务。只读事务。在设置了只读事务之后,尽管其他事务可能会提交新事在设置了只读事务之后,尽管其他事务可能会提交新事务,但只读事务不会取得新的数据变化。务,但只读事务不会取得新的数据变化。示例:示例:会话会话A:Set transaction read only;会话会话B:Update emp set sal=3000 where ename=SMITH;会话会话A:Select sal from emp where ename=SMITH;Set t

16、ransaction isolation level serializable;顺序事务,在只读事务的基础特性上还可以对数据进行顺序事务,在只读事务的基础特性上还可以对数据进行DML操作操作控制事务控制事务保存点保存点 B保存点保存点 ADELETEINSERTUPDATEINSERTCOMMITTime 事务事务ROLLBACK to SAVEPOINT BROLLBACK to SAVEPOINT AROLLBACKUPDATE.SAVEPOINT update_done;INSERT.ROLLBACK TO update_done;回滚到保留点回滚到保留点使用使用 SAVEPOINT S

17、AVEPOINTname语句在当前事务中语句在当前事务中创建保存点。创建保存点。使用使用 ROLLBACK TO SAVEPOINTname 语句回滚到创建语句回滚到创建的保存点。的保存点。用于取消部分事务用于取消部分事务自动提交在以下情况中执行自动提交在以下情况中执行:DDL 语句。语句。DCL 语句。语句。不使用不使用 COMMIT 或或 ROLLBACK 语句提交或回滚,正常结语句提交或回滚,正常结束会话。束会话。会话异常结束或系统异常会导致自动回滚。会话异常结束或系统异常会导致自动回滚。事务进程事务进程提交或回滚前的数据状态提交或回滚前的数据状态改变前的数据状态是可以恢复的改变前的数据

18、状态是可以恢复的其他用户不能看到当前用户所做的改变,直到当前用户结束事其他用户不能看到当前用户所做的改变,直到当前用户结束事务。务。DML语句所涉及到的行被锁定,语句所涉及到的行被锁定, 其他用户不能操作。其他用户不能操作。提交后的数据状态提交后的数据状态数据的改变已经被保存到数据库中。数据的改变已经被保存到数据库中。改变前的数据已经丢失。改变前的数据已经丢失。所有用户可以看到结果。所有用户可以看到结果。锁被释放,锁被释放, 其他用户可以操作涉及到的数据。其他用户可以操作涉及到的数据。所有保存点被释放。所有保存点被释放。COMMIT;改变数据改变数据提交改变提交改变DELETE FROM em

19、ployeesINSERT INTO departments VALUES (290, Corporate Tax, NULL, 1700);提交数据提交数据数据回滚后的状态数据回滚后的状态使用使用 ROLLBACK 语句可使数据变化失效语句可使数据变化失效:数据改变被取消。数据改变被取消。修改前的数据状态可以被恢复。修改前的数据状态可以被恢复。锁被释放。锁被释放。DELETE FROM copy_emp;ROLLBACK;语句级回滚语句级回滚单独单独 DML 语句执行失败时,只有该语句被回滚。语句执行失败时,只有该语句被回滚。Oracle 服务器自动创建一个隐式的保留点。服务器自动创建一个隐

20、式的保留点。其他数据改变仍被保留。其他数据改变仍被保留。用户应执行用户应执行 COMMIT 或或 ROLLBACK 语句结束事务。语句结束事务。锁锁Oracle 数据库中,锁是数据库中,锁是 :并行事务中避免资源竞争。并行事务中避免资源竞争。避免用户动作。避免用户动作。自动使用最低级别的限制。自动使用最低级别的限制。在事务结束结束前存在。在事务结束结束前存在。两种类型两种类型: 显示和隐式。显示和隐式。锁锁两种模式两种模式:独占锁独占锁: 屏蔽其他用户。屏蔽其他用户。共享锁共享锁: 允许其他用户操作。允许其他用户操作。高级别的数据并发性高级别的数据并发性:DML: 表共享,行独占表共享,行独占

21、Queries(查询)(查询): 不需要加锁不需要加锁DDL: 保护对象定义保护对象定义提交或回滚后锁被释放。提交或回滚后锁被释放。排它锁:若事务排它锁:若事务T T对数据对数据D D加加X X锁锁(独占锁独占锁),则其它任何事务都不能再对则其它任何事务都不能再对D D加任何类型的锁加任何类型的锁,直至,直至T T释放释放D D上的上的X X锁;一般要求在修改数据锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写前要向该数据加排它锁,所以排它锁又称为写锁。锁。共享锁:若事务共享锁:若事务T T对数据对数据D D加加S S锁(锁(共享锁共享锁),),则其它事务只能对则其它事务只能对D

22、 D加加S S锁,而不能加锁,而不能加X X锁,直锁,直至至T T释放释放D D上的上的S S锁;一般要求在读取数据前要锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。向该数据加共享锁,所以共享锁又称为读锁。加锁方法加锁方法自动加锁自动加锁INSERT UPDATE DELETE人工加锁人工加锁SELECT FOR UPDATE OFLOCK TABLE IN 锁类型锁类型MODE基本的锁类型有两种:基本的锁类型有两种:排它锁排它锁 Exclusive locksExclusive locks记为记为X X锁锁共享锁共享锁 Share locksShare locks记为记为

23、S S锁锁Oracle DMLOracle DML锁共有两个层次,即行级锁和表级锁。锁共有两个层次,即行级锁和表级锁。 Oracle的的TX锁(行级锁、事务锁)锁(行级锁、事务锁)TM锁(表级锁)锁(表级锁)OracleOracle的的DMLDML锁(数据锁)锁(数据锁)其行级锁虽然只有一种(即其行级锁虽然只有一种(即X X锁),锁),但其但其TMTM锁(表级锁)类型共有锁(表级锁)类型共有5 5种,种, 共享锁(共享锁(S S锁)、排它锁(锁)、排它锁(X X锁)、行级共享锁锁)、行级共享锁(RS RS 锁)、行级排它锁(锁)、行级排它锁(RXRX锁)、共享行级排锁)、共享行级排它锁(它锁(

24、SRXSRX锁),锁), 注意注意: :OracleOracle在行级只提供在行级只提供 X X锁,所以与锁,所以与RSRS锁(锁(通过通过SELECT SELECT FOR UPDATE FOR UPDATE语句获得)对应的语句获得)对应的行级锁也是行级锁也是X X锁(但是该行数据实际上还没有被锁(但是该行数据实际上还没有被修改)。修改)。当当OracleOracle执行执行SELECTSELECTFOR UPDATEFOR UPDATE、INSERTINSERT、UPDATEUPDATE、DELETEDELETE等等DMLDML语句时,系统自动在所语句时,系统自动在所要操作的表上申请表级要

25、操作的表上申请表级RSRS锁(锁(SELECTSELECTFOR FOR UPDATEUPDATE)或或RXRX锁(锁(INSERTINSERT、UPDATEUPDATE、DELETEDELETE),当表级锁获得后,系统再自动申请当表级锁获得后,系统再自动申请TXTX锁,并锁,并将实际锁定的数据行的锁标志位置位(指向该将实际锁定的数据行的锁标志位置位(指向该TXTX锁);锁);也可以通过也可以通过LOCK TABLELOCK TABLE语句来指定获得某种类语句来指定获得某种类型的型的TMTM锁。下表总结了锁。下表总结了OracleOracle中各中各SQLSQL语句产语句产生生TMTM锁的情况

26、:锁的情况:OracleOracle中各中各SQLSQL语句产生语句产生TMTM锁的情况:锁的情况:自动加锁自动加锁Oracle自动加锁有自动加锁有4种类型种类型数据锁数据锁行级锁行级锁数据锁是防止多个事务对同一个表或表中同一行操作时数据锁是防止多个事务对同一个表或表中同一行操作时产生的冲突产生的冲突当事务执行以下当事务执行以下DML语句,语句,INSERT UPDATE DELETE SELECT FOR UPDATE OF.表级锁表级锁当事务获得行锁后,此事务也自动获得表级共享锁,以当事务获得行锁后,此事务也自动获得表级共享锁,以防止其他事务进行防止其他事务进行DDL语句语句同样可以使用同

27、样可以使用LOCK TABLE人工定义表级共享锁人工定义表级共享锁Lock table table_name in row exclusive mode行加锁加重服务器的负担行加锁加重服务器的负担Lock table table_name in exclusive mode锁定命令可以一次锁定多个表锁定命令可以一次锁定多个表Lock table tab1,tab2 in exclusive mode锁类型:锁类型:Row share、row exclusive、share updateShare、share row exclusive、exclusive封锁机制的监控封锁机制的监控v$lock

28、v$lock视图列出当前系统持有的或正在申请的所有锁的情视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下:况,其主要字段说明如下:v$locked_objectv$locked_object视图列出当前系统中哪些对象正被锁定视图列出当前系统中哪些对象正被锁定查看锁等待的进程查看锁等待的进程查看当前的用户会话和对应的锁信息查看当前的用户会话和对应的锁信息Select s.sid,s.serial#,s.username,s.status,l.id1,l.lmode,l.request from v$session s,v$lock l where s.sid=l.sid and s.username is not null动态性能试图动态性能试图v$session查看造成锁等待的锁信息查看造成锁等待的锁信息Select l.id1,l.lmode,l.request from v$session s,v$lock l where s.lockwait=l.kaddr删除无效的会话进程删

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论