kfeiwu 2012-11-14 10:55
浏览 248
已采纳

请教spring的事务控制

1:spring的事务配置

tx:attributes








/tx:attributes
/tx:advice

<aop:config>  
    <aop:pointcut id="interceptorPointCuts"  
    expression="execution(public * com.*.*.bl.*.*.*(..))" />  
    <aop:advisor advice-ref="txAdvice"  pointcut-ref="interceptorPointCuts" />  
</aop:config> 

2:业务层的代码

private TestDao testDao;
public void saveData1(long id)
{
delData2(id);
testDao.addA1(A1对象);

}

private void delData2(long id)
{
testDao.deleteA1ById(id);
}

3:控制层action调用
private TestSverice testSvercie;
testSvercie.saveData1(id);

请问:1:
业务层的业务控制:
saveData1和delData2是不是共用一个事务

2:如果saveData1和delData2不是共用一个事务,当特定的情况下,如果saveData1和delData2获取的不是同一个连接,导致testDao.deleteA1ById(id);的操作无法提交,而testDao.addA1(A1对象); 则一直等待。业务delData2是私有方法,没有事务控制,而此刻他的数据库连接又是一个独立的。这样就导致锁表。
如果delData2的数据库连接和saveData1的数据库连接是同一个,则会被提交或回滚。

现在的问题是:action调用testSvercie.saveData1(id);会在非常底概率下发生private void delData2(long id)
{
testDao.deleteA1ById(id);
}
这个方法的事务不提交,导致死锁。

请各位帮忙分析一下真正的原因。谢谢。

  • 写回答

1条回答 默认 最新

  • weixin_42636837 2012-11-14 14:22
    关注

    1、不是一个事务。
    2、配置好像有点问题,execution(* com.*.*.bl.*.*.*(..)),我觉得去掉public就会正常的。或者直接像下面那样写不行么?
    public void saveData1(long id)
    {
    testDao.deleteA1ById(id);

    testDao.addA1(A1对象);

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号