2010-09-07 156 views
7

Spring的事务管理器已经有各种日志记录活动(启动,提交&回滚)的帖子。但是,最近我遇到了一个只记录活动不够的死锁问题。如何记录Spring事务内容

我们的代码中的根本问题是交易传播REQUIRED和REQUIRES_NEW的混乱使用。有很多来回的方法调用,最终导致很多事务堆叠在一起。唉,代码库非常庞大,解决方案很紧迫......(我们都知道这是什么)

问题是死锁,因为代码被添加到事务中的查询实体中,在另一个事务中被次序修改交易。 Spring会吐出一个异常,告诉实体X的更新超时,因为它被锁定。现在,知道这很好,但是如何找到错误的代码:早期锁定的查询。

我的问题(最后):有没有办法记录添加到事务中的实体?通过这种方式,我可以专门查找锁定Spring正在抱怨的实体的事务。

谢谢! :-)

回答

0

尝试在您的ORM中记录查询。可能会更容易找到“不良”交易。

1

Spring委托给一个事务管理器,所以Spring不知道在事务中哪些实体被触动了,事务管理器会这样做。正如Donz所说,寻找交易经理获取信息是最好的调查方法。

您也可以查看所有事务定义,并从除以外的所有事务中移除REQUIRES_NEW。只写/总是写类型方法(如审计或日志记录)。如果您的主要业务逻辑中有REQUIRES_NEW,那么这是一个错误或一些非常奇怪的设计。盲目去除它可能会有比你想象的更少的副作用。