• 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锁(表级锁)

  • 相关阅读:
    项目进度管理-PMBook 第六章
    项目范围管理-PMBook 第五章
    PMBook 中的开发生命周期
    项目整合管理-PMBook 第四章
    PMP 学习心得
    二维码的来源和生活应用
    package main 红色波浪线
    JS中监听事件的几种方法
    PEP8规范
    RestFul API 规范
  • 原文地址:https://www.cnblogs.com/lgxstudy/p/4217494.html
Copyright © 2020-2023  润新知