`

oracle 锁-悲观锁与乐观锁

阅读更多

 

总结于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;

分享到:
评论

相关推荐

    Hibernate的乐观锁与悲观锁

    ### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...

    hibernate的乐观锁和悲观锁

    ### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...

    hibernate乐观锁和悲观锁学习

    与悲观锁不同,乐观锁假设并发环境下数据不会被同时修改,因此在读取数据时不会立即加锁。只有在更新数据时,才会检查数据是否自上次读取后发生了变化。在Hibernate中,通常通过在实体类的映射文件中设置`optimistic...

    Java 中的悲观锁和乐观锁的实现

    ### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...

    oracle锁表处理

    - **并发控制**:使用Oracle提供的并发控制机制,如乐观锁或悲观锁。 通过以上方法,可以有效地分析并处理Oracle中的锁争用问题,提高系统的性能和稳定性。需要注意的是,在实际操作中应当谨慎处理锁争用问题,...

    查看Oracle锁表

    3. **并发控制机制**:如乐观锁和悲观锁等技术。 4. **定期检查锁定情况**:定期执行上述SQL查询,及时发现并解决锁定问题。 #### 五、总结 在Oracle数据库中,了解和掌握锁定机制对于确保数据完整性和提高系统...

    Oracle的锁机制

    根据锁定时间,锁可分为悲观锁和乐观锁。悲观锁假设数据操作会发生冲突,所以在读取数据时立即锁定,例如表级锁。乐观锁则在数据更新时检查冲突,如行级锁,这样可以提高并发性能。 根据保护的对象,Oracle的锁分为...

    在分布式事务中实现基于Oracle PLSQL UL LOCK的悲观离线锁

    Oracle中的用户级(UL)锁就是一种悲观锁,它允许用户自定义锁机制,提供更细粒度的控制。 PL/SQL UL LOCK的实现通常涉及以下几个步骤: 1. **创建锁表**:首先,你需要创建一个表来存储锁定信息。这个表通常包含...

    java调用Oracle的锁表命令

    - 考虑使用乐观锁或悲观锁策略,根据应用的并发需求选择合适的方式。 通过以上步骤,你可以在Java程序中安全有效地调用Oracle的锁表命令,确保数据一致性并优化并发性能。对于更复杂的应用场景,如分布式事务,...

    Hibernate实现悲观锁和乐观锁代码介绍

    Hibernate 实现悲观锁和乐观锁代码介绍 Hibernate 是一个基于 Java 的持久层框架,它提供了多种锁机制来实现事务的隔离性和一致性。在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 ...

    SQL数据库系统原理(二)———乐观锁与悲观锁、MVCC、范式理论、SQL和NoSQL比较

    在数据库系统中,为了保证数据的一致性和完整性,有多种并发控制策略,其中包括乐观锁和悲观锁。这两种锁机制主要用于解决事务在并发环境中的数据冲突问题。 乐观锁是一种假设事务在执行过程中不会发生冲突的策略。...

    oracle 锁

    - **乐观锁**:假设很少发生冲突,因此在提交事务时检查是否有冲突,如版本控制或时间戳。 - **悲观锁**:在访问数据时立即锁定,防止其他用户修改,适合高冲突环境。 4. **锁定级别**: - **多粒度锁定...

    oracle锁讲解笔记

    ### Oracle锁机制详解 #### 锁的基本概念与作用 锁机制是Oracle数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下...

    Oracle表死锁与解锁

    - 在编程时,对可能出现死锁的操作进行预测和处理,例如使用事务的乐观锁或悲观锁策略。 通过理解Oracle表死锁的原理、使用上述检测和解决方法,以及遵循最佳实践,可以有效地管理和防止数据库死锁,保证系统的稳定...

    大连华信教学课件Oracle-Pl-Sql.rar

    PL/SQL提供了诸如锁定、乐观锁和悲观锁等机制来处理这些问题。 10. **错误处理和调试**:有效的错误处理是保证程序健壮性的重要手段。学习如何使用RAISE异常,以及如何使用DBMS_DEBUG_JDWP等工具进行调试,可以帮助...

    Oracle PL SQL专家指南_高级PLSQL解决方案的设计与开发

    - 乐观锁与悲观锁 - 行级锁定与表级锁定 - 使用PRAGMA SERIALIZED避免死锁 8. **Chapter10 - 性能优化** - PL/SQL性能分析工具 - 代码优化策略:减少解析次数,缓存结果 - 使用绑定变量提升性能 - 子查询...

Global site tag (gtag.js) - Google Analytics