oracle解除锁表【原】
生活随笔
收集整理的這篇文章主要介紹了
oracle解除锁表【原】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在日常操作中,經常會有不小心被鎖表的情況發生
一般造成原因有:
- 開發人員不小心執行了 for update 查詢語句后,沒有解鎖
- 不合理代碼中開啟事務(begin transaction)后,沒有關閉(close)或回滾(rollback)該事務.
此時我們必須擁有dba的權限才能對被鎖的表進行解鎖操作.而鎖表的時如果突然斷網或斷電那么可能會報如下異常:
Exception in thread "Thread-4" org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: Io 異常: Connection reset ### The error may exist in file [D:\application\eclipse64ee\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7\wtpwebapps\isc\WEB-INF\classes\com\testdemo\pcis\isc\dao\LockMapper.xml] ### The error may involve com.testdemo.pcis.isc.dao.LockMapper.queryLockTableForUpdate-Inline ### The error occurred while setting parameters ### SQL: SELECT T.C_PK_ID as cId, T.C_IP as cIP,T.C_MEMO as cMemo ,T.T_CRT_TM as tCrtTm FROM WEB_ISC_LOCK T FOR UPDATE ### Cause: java.sql.SQLException: Io 異常: Connection resetat org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:128)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)at com.sun.proxy.$Proxy24.queryLockTableForUpdate(Unknown Source)at com.testdemo.pcis.isc.threadpool.MasterSlaveThread.judgeMasterNewCode(MasterSlaveThread.java:73)at com.testdemo.pcis.isc.threadpool.MasterSlaveThread.run(MasterSlaveThread.java:54) Caused by: java.sql.SQLException: Io 異常: Connection resetat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:829)at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049)at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854)at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370)at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3476)at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)... 7 more View Code?
創造鎖表情景:
SELECT * FROM STUDENT FOR UPDATE;現在查看有哪些表被鎖了
執行以下語句必須有oracle管理員權限,不然會報錯 "ORA-00942:表或視圖不存在"
SELECT OBJECT_NAME, MACHINE, S.SID, S.SERIAL#FROM GV$LOCKED_OBJECT L, DBA_OBJECTS O, GV$SESSION SWHERE L.OBJECT_ID = O.OBJECT_IDAND L.SESSION_ID = S.SID;?
解除被鎖定的表
ALTER SYSTEM KILL SESSION '219,59457'; -- 219為SID,59457為SERIAL繼續查看哪些表被鎖了
SELECT OBJECT_NAME, MACHINE, S.SID, S.SERIAL#FROM GV$LOCKED_OBJECT L, DBA_OBJECTS O, GV$SESSION SWHERE L.OBJECT_ID = O.OBJECT_IDAND L.SESSION_ID = S.SID;
?
?
在我自己的mybatis3項目中
如果用select * from tableName where id='XXX' for update 鎖表后不 rollback() 或 commit() ,那么只會鎖 id = 'XXX' 這一數據行
?
查看表被鎖的其它形式語句
SELECT OBJECT_ID,SESSION_ID,SERIAL# AS SERIAL,ORACLE_USERNAME,OS_USER_NAME,S.PROCESSFROM V$LOCKED_OBJECT A, V$SESSION SWHERE A.SESSION_ID = S.SIDAND SYSDATE - S.LOGON_TIME > 0.5?
其它參考
查詢Oracle正在執行的sql語句?
?ORACLE腳本之鎖表時 查詢誰鎖了表而又引起誰的等待--https://blog.csdn.net/haiross/article/details/17223295
其它相關語句
查看oracle中的鎖的情況.
SESSION_ID, USERNAME, MODE_HELD, MODE_REQUESTED, OBJECT_NAME, LOCK_TYPE, LOCK_ID
分別是 擁有鎖的SESSION_ID,擁有鎖的USERNAME,鎖的執行模式MODE_HELD,鎖的請求MODE_REQUESTED,鎖所在的數據庫對象名,鎖的類型,鎖的ID
?
轉載于:https://www.cnblogs.com/whatlonelytear/p/4714244.html
總結
以上是生活随笔為你收集整理的oracle解除锁表【原】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 执行了的程序,才是你的程序.
- 下一篇: Visual Studio 智能提示功能