一、锁概念
在高并发的情况下,数据库多个事务同时存取同一数据时,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。DM采用了多版本并发控制(MVCC) 和封锁机制,防止并发事务修改同一数据,保护数据一致性。
封锁机制是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据库对象进行操作前,需要先对其封锁。封锁后事务就对该数据库对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据库对象进行相应操作。
锁是实现数据库并发控制的重要手段,可以保证数据库在多人同时操作时能够正常运行。
周期:一般事务结束时释放锁。
二、锁模式
共享锁和排它锁相容性较差,意向锁能解决共享锁与排他锁相容性差的问题。
1.相认性质
--给表 "TEST1" 加共享锁
LOCK TABLE "TEST1" IN SHARE MODE;
--给表 "TEST1" 加排他锁
LOCK TABLE "TEST1" IN EXCLUSIVE MODE;
--给表"TEST1"加意向共享锁
LOCK TABLE "TEST1" IN INTENT SHARE MODE;
--给表"TEST1"加意向排他锁
LOCK TABLE "TEST1" IN INTENT EXCLUSIVE MODE;
锁的兼容性如下(“Y"代表相容,”N”代表不相容),可以从以下表锁的兼容性看到,当表TEST1 上了排他锁(X 锁),其他事务将无法查询(IS),插入、删除和更新(IX)表 TEST1。
2.相关动态视图
显示会话的具体信息:V$ SESSIONS
显示所有活动事务的信息:V$TRX
显示事务等待信息:V$TRXWAIT
显示活动事务视图信息:V$TRX_VIEW
显示当前系统中锁的状态:V$LOCK
显示死锁的历史信息:V$DEADLOCK_HISTORY
查询当前事务的ID:
SELECT TRX_ID FROM V$SESSIONS WHERE SESS_ID = SESSID();
3.锁等待问题
查看被挂起的事务TRX_ID:
SELECT VTW.ID AS TRX_ID, VS.SESS_ID, VS.SQL_TEXT, VS.APPNAME, VS.CLNT_IP FROM V$TRXWAIT VTW LEFT JOIN V$TRX VT ON(VTW.ID=VT.ID) LEFT JOIN V$SESSIONS VS ON(VT.SESS_ID=VS.SESS_ID);
通过挂起事务ID找到它等待的事务:
SELECT WAIT_FOR_ID,WAIT_TIME FROM V$TRXWAIT WHERE ID=TRX_ID值;
通过等待事务ID定位到连接以及执行的语句:
SELECT VT.ID AS TRX_ID, VS.SESS_ID, VS.SQL_TEXT, VS.APPNAME, VS.CLNT_IP FROM V$TRX VT LEFT JOIN V$SESSIONS VS ON(VT.SESS_ID=VS.SESS_ID) WHERE VT.ID = WAIT_FOR_ID值;
SP_CLOSE_SESSION关闭等待事务
SP_CLOSE_SESSION(SESS_ID);
文章
阅读量
获赞