kfeiwu 2012-11-14 02: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 06:22
    关注

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

    testDao.addA1(A1对象);

    }

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

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部