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

posted @ 2015-01-11 23:39  justlgx  阅读(109)  评论(0编辑  收藏  举报