weblogic The transaction is no longer active - status: Marked rollback
总部有个系统tzjh工作流报流程超时,无法走下去。分析性能问题,按我的风格,先做一个httpwatch的结果,根据结果大致定位。
看到结果后就是一个主请求很慢,定位到是java和SQL的问题,weblogic服务一切良好。找出问题时段的Oracle AWR,可以看到下面的SQL执行了4百多秒。
delete from gg_ru_todo_task_IPMS t
where exists (select 1
from gg_ru_temp_task tmp
where tmp.activity_ins_id = t.activity_ins_id
and tmp.ABORT_FLAG = 1)
看了一下此SQL的执行计划,完全没有问题,怀疑是统计信息有问题,查询了一下,都是对的。
-———————————————————————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-———————————————————————————————————————————————————-
| 0 | DELETE STATEMENT | | | | 24 (100)| |
| 1 | DELETE | gg_RU_TODO_TASK_IPMS | | | | |
| 2 | NESTED LOOPS SEMI | | 1 | 165 | 24 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | gg_RU_TODO_TASK_IPMS | 1147 | 145K| 24 (0)| 00:00:01 |
|* 4 | TABLE ACCESS BY INDEX ROWID| gg_RU_TEMP_TASK | 1 | 35 | 0 (0)| |
|* 5 | INDEX RANGE SCAN | TEMPTASK_INDEX3 | 1 | | 0 (0)| |
-———————————————————————————————————————————————————-
回头看了一下数据库报告,发现这条SQL没有消耗CPU,IO,根本就是在等待,从top5的等待事件中enq: TX - row lock contention很多可以看出。
这怎么可能呢?不同的单据删除的数据是不一样的啊。
在做测试的时候,发送流程后,利用以前写的诊断方法Oracle DML和DDL锁的解决方法,定位出来的block session是乱的,完全没有参考价值。
为什么会产生锁呢?又定位不到锁,然后我看了一下weblogic日志,有一个想法:
java.sql.SQLException: The transaction is no longer active - status: ‘Marked rollback. [Reason=weblogic.transaction.internal.TimedOutException: Transaction timed out after 598 seconds
BEA1-401582DCFE7EA151A605]‘. No further JDBC access is allowed within this transaction.
at weblogic.jdbc.wrapper.JTSConnection.checkIfRolledBack(JTSConnection.java:193) ~[com.bea.core.datasource6_1.9.0.0.jar:1.9.0.0]
at weblogic.jdbc.wrapper.JTSConnection.checkConnection(JTSConnection.java:209) ~[com.bea.core.datasource6_1.9.0.0.jar:1.9.0.0]
at weblogic.jdbc.wrapper.ResultSet.preInvocationHandler(ResultSet.java:99) ~[com.bea.core.datasource6_1.9.0.0.jar:1.9.0.0]
如果你有在Oracle数据库kill session的经验,有时间在数据库层面上kill session不一定生效,当无法当时kill的时候,数据库会告诉你session已经标记。如果你等不及,那必须得在操作系统层面上kill。
这里的错误日志不就是标记这个session需要回滚,而没有回滚成功吗!下面是weblogic console里面JTA timeout的解释:
weblogic JTA帮助文档:
Name Description
Timeout Seconds Specifies the maximum amount of time, in seconds, an active transaction is allowed to be in the first phase of a two-phase commit transaction. If the specified amount of time expires, the transaction is automatically rolled back.
MBean Attribute:
JTAMBean.TimeoutSeconds
Minimum value: 1
Maximum value: 2147483647
总结:weblogic出现这种错误The transaction is no longer active - status: ‘Marked rollback,数据库中出现行锁,原因是weblogic超时不一定能立即回滚(有些情况可以立即回滚,有些不行,跟操作系统一样),本质上是功能太慢导致。
还没有评论,来说两句吧...