Oracle的事务及锁

上传人:jin****ng 文档编号:110347929 上传时间:2022-06-18 格式:DOC 页数:4 大小:80KB
返回 下载 相关 举报
Oracle的事务及锁_第1页
第1页 / 共4页
Oracle的事务及锁_第2页
第2页 / 共4页
Oracle的事务及锁_第3页
第3页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1、事务的概念: 事务是一个基本的逻辑单元,它作为一个整体要么全部执行要么全部不执行。2、事务的特性: 原子性:事务是处理的一个原子单位,每一个操作不可拆分,它要么全部执行成功,要么全 部都不执行。一致性:指事务完成时,必须使所有的数据在整体上不变。 隔离性:各事务之间相互隔离,此事务的执行不受其他并发事务执行的干扰。 持续性:指事务对数据库的改变应是持续存在的,不会因故障而发生丢失。3、从功能是上划分,sql语言分为DDL、DML和DCL:3.1DDL(Data Definition Language,数据定义语言):用于定义和管理数据库中的所有对象的语言,女口: create创建表空间、alter修改表空间、drop 删除表空间3.2: DML(Data manipulation Language,数据操作语言):处理数据等操作,如:insert插入数据、delete删除数据、update修改数据、select查询数据3.3: DCL(Data Control Language,数据控制语言): 授予或回收访问数据库的权限,控制数据库操作事务发生的时间及效果,对数据库实行监视, 如: grant 授权, rollback 回滚, commit 提交4、事务的开始及结束:一个事务可以由一条 DDL 语句单独组成或多条 DML 语句共同组成。一个事务从执行第一 条 sql 语句开始,在它被提交或被回滚时结束。事务的提交可以是显式提交:用 commit 命 令直接完成;也可以是提交隐式提交:用 sql 语句间接完成提交,这些语句有: alter, audit, comment,create,disconnect,drop,exit,grant,noaudit,quit,revoke,rename,会话终止 等;还可以是自动提交: set autocommit on 或 set autocommit immediate 设置为自动提交,则 在插入、删除、修改语句执行后自动提交,使用set autocommit off可以取消自动提交,show autocommit可以查看自动提交是否打开。事务的回滚使用rollback语句,可以为事务设置保 存点,如:savepoint point1, 然后使用 rollback to savepoint point1 回到保存点 point1, 若在 point1后又设置了一个保存点savepoint point2,则在rollback to point1后将不能再回滚到 point2,因为point2在point1的后面,point1的保存点不存在point2。5、事务的并发性与一致性 : 并发性:多个用户可以在同一时刻访问相同的数据。 一致性:保证并发性的同时,每个用户能得到一致的数据视图。 并发执行事务时,可能发生如下情况: 脏读:某个事务读取了其他未提交事务修改过的数据。 脏读示例:提交读隔离级别可防止脏读,但不能防止不可重复读时间事务1事务2T1事务启动T2从emp表中删除或增加记录事务启动T3基于事务1未提交的结果,计算员工总数T4事务回滚 不可重复读:某个事务读取一次数据后,其他事务修改了这些数据并进行了提交,这样 当该事务重新读取这些数据时,就会得到与前一次读取不一致的结果。简单的说,就是同样 的条件,你读取过的数据,再次读取时发现值不一样了。不可重复读示例:可重复读隔离级别可防止脏读和不可重复读时间事务1事务2T1事务以提交读模式启动T2计算员工总工资事务启动T3修改员工张三的工资T4事务提交T5计算员工总工资T6获取员工人数T7计算平均薪水 幻象:在某个事务执行第一次查询时获得了满足查询条件的一个结果集,随后其他事务 又插入或删除了一些满足查询条件的记录,这样当该事务重新执行相同的查询时,会得到与 前一次查询不一致的情况。简单的说,就是同样的条件,第一次和第二次读出来的记录数不 一样了。幻象示例:时间事务1事务2T1事务以可重复读模式启动T2计算员工总薪水事务启动T3添加一个员工T4事务提交T5计算员工总薪水T6计算员工总人数T7计算平均工资 更新丢失:例如系统允许两个事务A、B同时更新同一数据50, A事务和B事务同时 取得该数据,A事务将50加上50得到100,然后保存回数据库;而事务B将50加上100 得到150,然后保存数据时覆盖了事务A保存的数据。两个事务更新后的数据本该是200, 而结果A更新的50丢失了。6、解决数据脏读、不可重复读等问题的隔离级别:Oracle 提供了三种隔离级别:Read Committed(提交读)、Serializable(串行读)、Read Only(只 读)。 Read Committed是Oracle默认隔离级别,若事务A先于事务B开始,事务B是Read Committed隔离级别,则不管事务A是哪种隔离级别,只要事务A未提交,事务B就会一 直处于等待状态,直到事务A提交为止。Read Committed消除了脏读,也不会丢失更新, 但无法避免不可重复读和幻象读的发生。 Serializable串行化隔离级别,确保事务顺序执行不被干扰,只要Serializable的事务在执 行期间,其他事务要对其数据进行修改,便会发生无法序列化的访问错误,可以避免脏读、 不可重复读、幻象、更新丢失,提供了最高级别的一致性,但并发性最低。 Read Only 只读隔离级别不允许在事务内对其进行修改或插入等更新操作。 Read Only 可以消除脏读。SQL-92 规范制定的 4 种隔离级别:未提交读(read uncommitted)提交读(read committed)可重复读(repeatable read)串行读(serializable read)总结:隔离级别脏读不可重复读幻象未提交读会会会提交读不会会会可重复读不会不会会串行读不会不会不会7、为事务或会话设置隔离级别: 设置一个事务的隔离级别:SET TRANSACTION ISOLATION LEVEL READ COMMITTED;-设置 Read Committed 级别 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;-设置 Serializable 级别SET TRANSACTION READ ONLY-设置 Read Only 级别 设置整个会话的隔离级别:ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;8、事务与锁 锁机制用于管理对共享资源的并发访问,防止访问相同资源时发生的有害性交互。基本上所 有的锁都由 oracle 内部自动创建和维护,但是其中的 DDL 和 DML 锁是可以通过命令直接 或间接管理的。当事务在对某个数据对象进行操作前,先向系统发出请求,对其所访问的数据对象加锁,加 锁后事务就对该数据对象有一定的控制,在该事务释放锁之前,其他事务不能对此数据对象 进行更新操作。Oracle 提供的两种类型的锁机制: 独占锁:防止相关资源被共享,主要用来修改数据,只有在独占资源的事务释放独占锁 后,其他事务才能对其资源进行操作。 共享锁:允许相关资源的共享,依赖于所包含的操作,多个用户读数据可以使用共享锁。Oracle 中锁的类型: 内部级锁:由 Oracle 自动管理,以保护 Oracle 的内部结构。 DDL 级锁(字典/语法分析锁):用于保护数据字典和数据定义改变时的一致性和完整性, 由系统在对 sql 定义语句做语法分析时自动加锁,如该锁在使用 create、drop、alter、truncate 语句时自动创建,以确保在执行过程中没有其他事务对资源进行访问。DDL锁可分为三类: 字典操作锁、字典定义锁、表定义锁。 DML 级锁:用于控制并发事务中的数据操作,保证数据的一致性和完整性,其锁对象 是表或行,在事务开始时创建,事务提交或回滚时释放。 DML 锁可以由用户以显式的方式 加锁,也可以通过 sql 语句隐式加锁。DML 封锁技术:I、共享方式的表封锁(share): lock table 表名,表名in share mode nowait; 共享方式的表封锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其 他用户对已封锁的表进行更新,其他用户只能对该表再施加共享方式的锁,而不能再对该表 施加独占方式的锁。共享该表的所有用户只能查询表中数据,不能更新,只能用sql语句加 该锁。如下方式可以释放该锁:commit或rollback语句,退出数据库,程序停止运行。II、独占方式的表封锁(exclusive): lock table 表名,表名 in exclusive mode nowait; 独占方式的表封锁对表中的所有数据进行封锁,拥有该独占方式的表封锁的用户,既可以查 询该表又可以更新该表,其他用户不能再对该表施加任何锁,其他用户只可以查询该表。独 占方式的表封锁还可以在执行 DML 语句 insert、 update、 delete 时隐式获得。如下方式可 以释放该锁:commit或rollback语句,退出数据库,程序停止运行。III、共享更新方式封锁(share update): lock table 表名,表名 in share update modenowa it;或者select 列名,列名 from 表名where 条件for upda te of 列名,列名 nowa it;共享更新方式封锁是对表的一行或多行进行封锁,也称为行级锁。该锁使得用户可以查询也 可以更新被封锁的数据行,其他用户只能查询,若其他用户想更新表的数据行,则必须也要 加共享更新方式锁,但其他用户的更新必须在上一个用户提交或回滚后才行。如下方式可以 释放该锁:commit语句,退出数据库,程序停止运行。9、各锁的相容及互斥关系:(Y表示可以,N表示不可以)用户2操作用户1已加锁shareexclusiveshareupdate力口 share锁YNN力口 exclusive 锁NNN力口 share update 锁YYY更新数据(增、删、改)NNY(在其他行上)10、死锁下例便是一个死锁:会话 A 更新表 A 会话 B 更新表 B会话 B 更新表 A-阻塞会话A更新表B-导致死锁Oracle 处理死锁的方式: Oracle 系统会自动发现死锁,并选择代价小的,即完成工作量最少 的事务予以撤销,释放该事务所拥有的全部锁,让其他事务继续工作下去。11、加锁的注意事项: 对于 update、delete 操作,应只封锁要做改动的行,在完成修改后立即提交。 当多个事务正利用共享更新的方式进行更新,则不要使用共享封锁,而应采用共享更新锁, 这样其他用户就能使用行级锁,以增加并行性。 尽可能将对一个表的操作的并发事务施加共享更新锁,从而提高并行性。 在应用负荷较高的期间,不宜对基础数据结构(表、索引、簇、视图)进行修改。12、加锁语句:lock table 表名 in 锁定模式 mode nowait;解释:锁定模式为share表示共享锁(允许加锁,不许修改),为share update表示共享更新方 式封锁,为 exclusive 表示独占锁(不许加锁,不许修改),为 row share 表示行级共享锁(允许 加锁,不许修改),为 row exclusive 表示行级独占锁(不许加锁,不许修改),为 share row exclusive 表示共享行级独占锁(对相应行加独占锁,对表加共享锁,其他事务可对其他行加 独占锁)。 nowait 选项表示锁未添加成功时,则返回并由用户决定等待还是去执行其他语句。 添加行级共享锁: select from 表名 for update;create 语句自动加共享锁, alter 语句自动加独占锁, insert、 update、 delete 语句自动添加 行级独占锁。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!