DM8 支持多用户并发访问、修改数据,所以就有可能多个事务访问同一条数据导致数据库不一致的情况。所以需要锁来对并发访问进行控制。
DM支持4种不同的锁模式:
- 共享锁
- 排他锁
- 意向共享锁
- 意向排他锁
共享锁
表明该事务访问表中所有元组,其他事务不能对该表做任何更新操作。
允许操作:其它事务在该表上作查询,但是不允许作修改,且允许多个事务在同一表上并发地持有 共享表封锁。
禁止操作:其它事务对表进行执行意向排他锁和排他锁方式封锁。
排他锁
只允许持有封锁的事务可对该表进行修改。
允许操作:不允许任何操作。
禁止操作:其它事务对表执行任何 DML 语句,即不能插入、修改和删除该表中的行,封锁该表中 的行或以任何方式封锁表。
意向共享锁
该事务封锁了表上的一些元组并试图修改它们。
允许操作:其他事务对该表的并发查询、插入、更新、删除或在该表上进行封锁,其他事务可以同 时上意向共享锁、意向排他锁、共享锁。
禁止操作:其它事务以排他锁方式存取该表。
意向排他锁
该事务对表的元组进行一次或多次修改。
允许操作:其它事务并行查询、插入、更新、删除或封锁该表上行,允许多个事务在同一表上获得 意向排他和意向共享锁。
禁止操作:其它事务对表进行共享或者排他读写封锁。
一个事务可以拥有一个或多个锁,但是有些锁是不相容的,如下图所示:
比如当一个表加入了 IS 锁,就不能再加入 X 锁了;一个表加了 X 锁,就不能加其他锁了。
如果一个事务占用了锁的资源,并且这个锁的资源也是另一个事务所需要的,这时这两个事务就会发生冲突,就会发生堵塞。
一般来说,等待第一个事务结束之后,该事务就会释放锁资源,第二个事务就能顺利执行。但是如果这两个事务互相形成了依赖关系,那么就形成了死锁,此时 DM 数据库就会选择牺牲掉一个事务。
查看锁
可以通过 V$LOCK 这个视图来查看当前系统中锁的状态、事务 ID 等信息。
检测活动事务
可以通过 V$TRXWAIT 来查看事务的等待信息,可以查看当前系统中事务等待信息。
查看死锁
同意通过 V$DEADLOCK_HISTORY 来查看死锁的历史信息。
可以通过检测活动事务,查到所等待的事务 ID (WAIT_FOR_ID),通过查询会话 (V$SESSION),就可以查询到具体的会话内容(SQL_TEXT),此时可以判断是否需要清除所等待的事务来保证当前事务正常运行,通过 SP_CLOSE_SESSION(SESS_ID) 来关闭这个会话。
达梦社区网址:eco.dameng.com/