现在的位置: 首页 > 综合 > 正文

第3代架构的事务问题

2013年10月16日 ⁄ 综合 ⁄ 共 907字 ⁄ 字号 评论关闭

在Action的一个方法中,依次调用两次Service的变更方法,前一个方法成功,后一个方法失败。则第一个事务提交,第二个事务回滚。
在Service的一个方法中,调用其他Service的变更方法,任意位置出现异常,则事务回滚。

在编程规范中已经明确,对于变更类型的操作,在Action中,一次请求只能调用一次Service的变更类型的方法。
    也就是说一个Action的方法中只允许调用一次Service的变更类型方法。

由于需要记录日志,问题就比较特殊了,导致的结果是:在一次请求中调用了日志插入操作和业务操作两个变更类型的方法。
他们两个是两次事务,一个的失败对另一个没有影响,这就是为什么写日志失败还能继续业务操作的原因。

数据库操作失败时,连接池的释放需要一定时间。连接池中的连接数量有限,如果并发情况下大量错误出现,
则可能导致连接来不及释放,连接池就已经被用完的现象,如果已知数据库操作的最长时间,建议在WebLogic中设置数据库操作超时时间,
对于超时的数据库连接强制回收(在阳光财险设置了这个参数)。

一个Action中调用两次查询类型的Service方法(不管是否属于同一个Service)
查询方法设置为PROPAGATION_REQUIRED时
这两次Service方法各有自己的事务,使用不同的数据库连接,Service中的每次数据库操作都使用同一数据库连接
查询方法设置为PROPAGATION_SUPPORTS时
这两次Service方法都没有事务,Service中的每次数据库操作都可能使用不同的数据库连接

一个查询类型的Service方法中调用其他Service的查询类型的方法
查询方法设置为PROPAGATION_REQUIRED时
有一个事务,每次数据库操作都使用同一数据库连接
查询方法设置为PROPAGATION_SUPPORTS时
没有事务,每次数据库操作都可能使用不同的数据库连接

一个变更类型的Service方法中调用其他Service的方法
查询方法设置为PROPAGATION_REQUIRED和设置为PROPAGATION_SUPPORTS时一样
有一个事务,每次数据库操作都使用同一数据库连接

抱歉!评论已关闭.