ORA-01591:lockheldbyin-doubtdistributedtransaction問題解決
昨天跑批量數據的程序時遇到oracle錯誤:
$tail -f INDB_ERROR_8.LOG
[Time]2014-12-01 04:10:31: activeAccountDeposit in oracle error: =ORA-01591: lock held by in-doubt distributed transaction 20.21.65527021
[Time]2014-12-01 04:10:31: 文件:/billing/drecv4/drecvlog/201411/DRECV/tmp/8-15-accountdeposit.dat改名到/billing/drecv4/drecvlog/201411/DRECV/tmp/8-15-accountdeposit.dat.err失敗!ORA-01591: lock held by in-doubt distributed transaction 20.21.65527021
DwriteOffCore.cpp:3152
[Time]2014-12-01 04:10:31: 8-15-accountdeposit.dat更新表發生錯誤!ORA-01591: lock held by in-doubt distributed transaction 20.21.65527021
DwriteOffCore.cpp:4431
[Time]2014-12-01 04:10:31: 入庫發生錯誤!
重復跑程序錯誤依舊。
打開數據庫,查看這個tran_id確實有,其實是11月19號的時候就留下了這個事務。這是分布式事務的問題,當執行這個事務的時候遇到一些問題,比如網絡問題,oracle就會卡住在這裡,一直留著,當後面你更新到這條數據的時候就會報這個錯。
然後找dba,他執行一下:
rollback force ‘20.21.65527021’
commit
搞定。
後續防止這個錯誤的其中一個方法就是,在跑批量程序前,統一先檢查並殺掉這些阻塞。