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超时不一定能立即回滚(有些情况可以立即回滚,有些不行,跟操作系统一样),本质上是功能太慢导致。

你可能感兴趣的:(weblogic)