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