事务是用来保证数据的一致性( integrity )而锁是保证数据的并发(控制多个事务的并发)( concurrency )。 锁的级别越高,可能会影响数据库的并发。锁的级别越低一般来说数据库的并发越好。 锁在 JDBC,JTA 以及容器管理的事务中的用法基本一样,也有写不同,主要在 JTA 分布式事务上个别又差异。 事务只是用来保证,数据一致性,一致性包括 : 能否保证与其他事务的隔离,以及能否在同一事务中保证重复读,脏读,脏写等等方面。 Oracle 在不是手工加锁的情况下, ORACLE 会自动调度锁。 ORACLE 自动调度锁得执行顺序,一般不会发生死锁现象。有些数据库会自动调度数据库锁得级别,这就增加了死锁的可能, ORACLE 永远不会自动调度锁的级别,死锁发生时, oracle 也会去自动调度,这要延时一段时间, ORACLE 自己的策略,会 ROLLBACK 一个事务,以保证发生死锁的 2 个事务都执行下去。 锁的种类很多,有 DML,DDL 锁以及其他,平时我们开发过程中主要是 DML,DDL 锁。 DML 锁又分很多方面:
RS: row share RX: row exclusive S: share SRX: share row exclusive X: exclusive
( 1 ) RS 可以通过一下声明方式来锁定表的行
SELECT ... FROM table ... FOR UPDATE OF ... ;
LOCK TABLE table IN ROW SHARE MODE;
一旦被 RS 锁定,不允许再对表进行 LOCK TABLE table IN EXCLUSIVE MODE
( 2 ) RX 可以通过一下声明方式来锁定表的行
LOCK TABLE table IN ROW EXCLUSIVE MODE;
一旦通过 RX 锁定了表中的行,不允许对表进行下列操作
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
( 3 ) s ( share table lock )可以通过以下方式锁定表
LOCK TABLE table IN SHARE MODE (可以说有多个 S 锁定一个表) ;
允许进行的操作,所有的查询以及 SELECT ... FOR UPDATE, 和 LOCK TABLE ... IN SHARE MODE ,只允许本事务内更新数据( update ,这种情况也是只允许当前表上就一个 S 锁)
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
LOCK TABLE table IN ROW EXCLUSIVE MODE;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
比 S 少了一点,这里只是允许一个 SRX 锁定一个表
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
( 5 ) X 级别最高的锁定形式: LOCK TABLE table IN EXCLUSIVE MODE;
Table 13-4 Locks Obtained By DML Statements
DML Statement | Row Locks? | Mode of Table Lock |
SELECT ... FROM table | | |
INSERT INTO table ... | X | RX |
UPDATE table ... | X | RX |
DELETE FROM table ... | X | RX |
SELECT ... FROM table ... FOR UPDATE OF ... | X | RS- |
LOCK TABLE table IN ... | | |
ROW SHARE MODE | | RS |
ROW EXCLUSIVE MODE | | RX |
SHARE MODE | | S |
SHARE EXCLUSIVE MODE | | SRX |
EXCLUSIVE MODE | | X |
这个表上很清楚
posted on 2006-11-30 10:36
小小程序程序员混口饭吃 阅读(4517)
评论(2) 编辑 收藏 所属分类:
java 、
oracle