当前位置:首页 > 开发 > 数据库 > 正文

oracle 锁-悲观锁与乐观锁

发表于: 2012-09-14   作者:blackproof   来源:转载   浏览次数:
摘要:   总结于ocl编程艺术:   经常发生的错误错误:更新丢失,旧数据更新了最新的数据。   解决问题的方法: 在Oracle中看好悲观锁(取决于oracle锁开销小,高并发),但在其他的数据库已Deprecated 悲观锁:在用户有意执行更新等DML操作之前,就在行上加锁 for update nowait 悲观锁的结果:    

 

总结于ocl编程艺术:

 

经常发生的错误错误:更新丢失,旧数据更新了最新的数据。

 

解决问题的方法:

Oracle中看好悲观锁(取决于oracle锁开销小,高并发),但在其他的数据库已Deprecated

悲观锁:在用户有意执行更新等DML操作之前,就在行上加锁 for update nowait

悲观锁的结果:

                        给数据加锁,其他用户可以访问,但是不可以修改记录

                        当其他用户正在更新,则会得到ora-00054resource busy

                        得到0行,说明此列已经被修改,

代码:

scott@ORA10G> select empno, ename, sal

2 from emp

3 where empno = :empno

4 and ename = :ename

5 and sal = :sal

6 for update nowait

7 /

EMPNO ENAME SAL

---------- ---------- ----------

7934 MILLER 1300

 

scott@ORA10G> update emp

2 set ename = :ename, sal = :sal

3 where empno = :empno;

1 row updated.

scott@ORA10G> commit;

 

 

 

 

乐观锁:

1只在更新的时候,保存着所有旧的值,用所有旧的值去查找记录来更新

  乐观锁的结果:

               成功更新数据

               更新0条数据,说明更新的数据已经被更新了,需要添加附加的解决冲突的策略

代码:

Update table

Set column1 = :new_column1, column2 = :new_column2, ....

Where primary_key = :primary_key

And column1 = :old_column1

And column2 = :old_column2

 

 

2为表添加一列,当更新时,列值相同可执行更新,若不同则更新过时,添加解决冲突策略。一般使用trigger来维护这一列的值,在update时,更新这一列值。但是出发器的开销太大,为了实现这样的功能小用牛刀。

 

 

        3使用校验和的乐观锁定:

(单向散列函数取一个变长输入串(即数据),并把它转换为一个定长的输出串(通常更小),这个输出称为散列值(hash value)。散列值充当输入数据的一个惟一标识符(就像指纹一样)。可以使用散列值来验证数据是否被修改)

实现方法:

                          OWA_OPT_LOCK.CHECKSUM

                          DBMS_OBFUSCATION_TOOLKIT.MD5

                          DBMS_CRYPTO.HASH

这种方面消耗cpu较多,但是网络传输量小。

 

         4ORA_ROWSCN的乐观锁定

Ora

Ora_rowscn默认是块级的,要设置支持行

create table dept

 (deptno, dname, loc, data,

constraint dept_pk primary key(deptno)

)

 ROWDEPENDENCIES

 as

 select deptno, dname, loc, rpad('*',3500,'*')

 from scott.dept;

oracle 锁-悲观锁与乐观锁

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Hibernate事务与并发问题处理(乐观锁与悲观锁) 一、数据库事务的定义   数据库事务(Database Tr
悲观锁的实现 :悲观锁依赖于数据库机制,在整个过程中将数据锁定,其他任何人都不能读取或修改 乐
悲观锁的实现 :悲观锁依赖于数据库机制,在整个过程中将数据锁定,其他任何人都不能读取或修改 乐
Select …forupdate语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨
mysql乐观锁总结和实践 博客分类: MyBatis 数据库 mysql 数据库 乐观锁 悲观锁 上一篇文章《MySQL
谈到悲观锁和乐观锁,就要谈到数据库的并发问题,数据库的隔离级别越高并发性就越差 并发性:当前系
背景知识: 1.事务(Transaction)及其ACID属性 原子性(Atomicity):事务是一个原子操作单元,其对
oracle和Mysql两种数据库悲观锁和乐观锁机制及乐观锁实现方式: 一、Oracle Oracle数据库悲观锁与乐
在使用Hibernate的过程我们会遇到多个人对同一数据同时进行修改,这个时候就会发生脏数据,造成数据
在使用Hibernate的过程中,我们会遇到多人对同一个数据同时进行修改,这个时候就会产生脏数据,造成
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号