更新时间:2019年07月26日 11时18分27秒 来源:黑马程序员论坛
一 并发处理 数据库的特点就是数据的集中管理和共享。在通常情况下总是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。因此,数据库管理系统的一个重要任务就是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确的结果。我们知道,事务并发执行时若不加控制的话将导致不正确的结果和数据库的不一致状态。为保证数据库数据正确地反映所有事务的更新以及在一事务修改数据时其它事务不同时修改这个数据,数据库系统用锁来控制对数据的并发存取。 二 ORACLE的并发处理机制 无需任何说明,ORACLE自动提供行级锁,它允许用户在没有冲突的情况下更新表中不同的行。行级锁对联机事务处理非常有用。 1 ORACLE锁的类型 在正常情况下,ORACLE会自动锁住需要加锁的资源以保护数据,这种锁是隐含的,叫隐含锁。然而,在一些条件下,这些自动的锁在实际应用时并不能满足需要,必须人工加一些锁。这些人工加的锁叫显示锁。 下面指明了会产生隐含锁的SQL语句: INSERT; UPDATE; DELETE; DDL/DCL语句。 下面指明了会产生显示锁的SQL语句: SELECT FOR UPDATE; LOCK TABLE IN XXX MODE。 解决读的不可重复性可以用下面的方法。在ORACLE中,用SELECT FOR UPDATE对预期要修改的记录加行排它锁(X),对表加行共享锁(RS)。它常用于要锁住一行,但不去真的修改这一行。锁之间是有相互作用的。例如,更新时会对表加RX锁,对行加X锁,而只有RS锁和RX锁允许再加RX锁。因此,当存在RS和RX锁时,表允许更新。再比如,当执行DDL和DCL语句时,会对表加排它锁X,而在存在X、RS、SRX、RX和S锁的前提下,都不能再加X锁。因此,当存在X,RS,SRX,RS或S锁时,不能对表做DCL和DDL操作。这样,数据库会自动防止一个用户更新表中的数据,而其他用户在同时修改表的结构。 2 ORACLE只读事务 ORACLE支持只读事务。只读事务有以下特点: * 在事务中只允许查询 * 其它事务可修改和查询数据 * 在事务中,其它用户的任何修改都看不见 只读事务的写法为: SET TRANSACTION READ ONLY SQL 语句 COMMIT,ROLLBACK,DDL结束只读事务 3 事务一致性的级别 事务是定义和维护一致性的单位,封锁就是要保证这种一致性。如果对封锁的要求高会增加开销,降低并发性和效率;有的事务并不严格要求结果的质量(如用于统计的事务),如果加上严格的封锁则是不必要和不经济的。因此有必要进行进一步的分析,考察不同级别的一致性对数据库数据的质量及并行能力的影响。 一致性级别定义为如下的几个条件: (1) 事务不修改其它任何事务的脏数据。脏数据是被其它事务修改过,但尚未提交的数据。 (2) 在事务结束前不对被修改的资源解锁。 (3) 事务不读其它任何事务的脏数据。 (4) 在读前对数据加共享锁(RS)和行排它锁,直至事务结束。 * 满足条件1的事务叫第0级事务。 * 满足条件1和2的事务叫第1级一致性事务。 * 满足条件1、2和3的事务为2级一致性事务。ORACLE的读一致性保 证了事务不读其它事务的脏数据。 * 满足条件1、2、3和4的事务叫第3级一致性事务。 由ORACLE的三个性质:自动加隐式锁、在事务结束时释放锁和读一致性,使ORACLE成为自动满足以上的0、1和2级一致性事务。因此,ORACLE自动防止了脏读(写-读依赖)。但是,ORACLE不能自动防止丢失修改(写-写依赖),读的不可重复性(读-写依赖),彻底解决并发性中的问题还需满足第4个条件(3级一致性事务),这需要程序员根据实际情况编程。 方法如下: * 如果想在一段时间内使一些数据不被其它事务改变,且在本事务内仅仅查询数据,则可用SET TRANSACTION READ ONLY 语句达到这一目的。 * 如果想在一事务内修改一数据,且避免丢失修改,则应在读这一数据前用SELECT FOR UPDATE对该数据加锁。 * 如果想在一事务内读一数据,且想基于这一数据对其它数据修改,则应在读数据前对此数据用SELECT FOR UPDATE加锁。对此种类型的应用,用这条SQL语句加锁最恰当。 * 如果想避免不可重复读现象,可在读前用SELECT FOR UPDATE对数据加锁,或用SET TRANSACTION READ ONLY设置只读事务。 |
推荐了解热门学科
java培训 | Python人工智能 | Web前端培训 | PHP培训 |
区块链培训 | 影视制作培训 | C++培训 | 产品经理培训 |
UI设计培训 | 新媒体培训 | 产品经理培训 | Linux运维 |
大数据培训 | 智能机器人软件开发 |
传智播客是一家致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。
传智播客从未停止思考
传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”
中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。
何为中高级程序员课程?
传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展。“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。
黑马程序员热门视频教程【点击播放】
Python入门教程完整版(懂中文就能学会) | 零起点打开Java世界的大门 |
C++| 匠心之作 从0到1入门学编程 | PHP|零基础入门开发者编程核心技术 |
Web前端入门教程_Web前端html+css+JavaScript | 软件测试入门到精通 |