zoukankan      html  css  js  c++  java
  • ORacle锁

    锁:用来共享资源控制并发访问的一种机制

    锁由Oracle自动管理,锁持续的时间等于被提交事务处理的时间

    单用户数据库不需要锁机制

    锁类型

    1.共享锁(shar locks)也称为读锁,s锁,共享数据,可以同时访问不允许修改。

    2.排他锁(Exclusive Lock)也称为写锁,X锁,该事物单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁获排他锁。

    DML锁 (DML LOCK):用来保护数据的完整 性和一致性。

    DDL锁(DDL LOCK):用来保护数据对象的结构,如表,索引等结构定义,

    内部锁和闩(internal locks and latchs):用来保护数据库内部数据结构。

    悲观锁:指读取数据后马上锁定相关资源

    语法:SELECT.....(查询语句后)FOR UPDATE[OF COLUMN_LIST][wait n|notwait]

    of子句用于制定即将更新的列,即锁定行上的特定列;

    wait子句制定等待其他用户释放锁的秒数,防止无限期的等待,NOWAIT表示不等待。

    会话1

    SELECT account_balance FROM topic7_account WHERE account_id=1001 FOR UPDATE; --悲观锁
    UPDATE topic7_account SET account_balance=account_balance-5000 WHERE account_id=1001;--提款5000
    commit;

    会话2

    UPDATE topic7_account SET account_balance=account_balance+500 WHERE account_id=1001;--存款500
    commit;

    注意:当 会话1运行并提交释放锁的时候会话2才执行完毕

    乐观锁:把所有锁定都延迟到即将执行更新之前

    (在更新语句后的WHERE子句增加条件查找到的旧值没有改变得情况下才能更改,否则更新失败)

    语法:UPDATE TABLE_NAME SET COLUMN_NAME1=NEWVALUE1,COLUMN_NAME2=NEWVALUE2...WHERE COLUMN_NAME1=OLDVALUE1 AND COLUMN_NAME2=OLDVALUE2...

    会话1

    --乐观锁
    SELECT * FROM topic7_account WHERE account_balance=1000;
    
    UPDATE topic7_account SET  account_balance=account_balance+300
    WHERE account_id=1001 AND account_balance=1000;
    COMMIT;

    会话2

    --乐观锁
    SELECT * FROM topic7_account WHERE account_balance=1000;
    
    UPDATE topic7_account SET  account_balance=account_balance+300
    WHERE account_id=1001 AND account_balance=1000;

    会话1执行乐观锁定,同时会话2更改了会话1中乐观锁的查找条件的时候会话1更新失败。

    DML锁:包含TX锁(事务锁或行级锁),TM锁(表级锁)

  • 相关阅读:
    用Jenkins构建Django持续集成环境
    DACLs and ACEs
    windows共享文件分析
    summary
    Mysql InnoDB行锁实现方式
    网关 整理 fastcgi wsgi
    Git提交代码规范 而且规范的Git提交历史,还可以直接生成项目发版的CHANGELOG(semantic-release)
    松本行弘:代码的未来(图灵访谈)
    “对外部(局部)变量的访问”是C语言函数指针的最大弱点
    CAP解决方案-BASE
  • 原文地址:https://www.cnblogs.com/lgxstudy/p/4217494.html
Copyright © 2011-2022 走看看