iBatis [+ Spring]事务中的多个“数据库操作”

时间:2012-06-03 17:37:44

标签: ibatis

如何使用iBatis& amp;&amp ;;>实现涉及多个数据库操作的事务到> 1个表的事务。弹簧?

让我详细解释一下:
我有2张桌子A& B与主人 - 细节关系。 [单个数据库中的两个表]。

/ *表A:* /

a_id [主键]
[加上其他栏目]

/ *表B:* /

b_id [Primary Key]  
a_id [Foreign Key = PK of table A]  
[plus other columns]  

在我的Dao中我有以下方法(我使用iBatis sqlMap来执行数据库操作):

insertA();  
insertB();  
updateA();  
updateB();  
deleteA();  
deleteB();  

上述每个操作都是Atomic(可由客户端调用,并在数据库中提交 - 通过Spring / iBatis)。

到目前为止,一切正常! [即我能够在每张桌子上执行 INDIVIDUAL 插入/更新/删除。]

- NEXT,我需要执行上述两个DB操作的组合作为ATOMIC操作;
这是我想要从SVC层实现的目标:

start Tranaction  
    operation on Table-A (via method of Dao class) - op #1  
    operation on Table-B (via method of Dao class) - op #2  
end Transaction  

示例1:

start Tranaction  
    insertA();  
    insertB();  
end Transaction  

示例2:

start Tranaction  
    updateA();  
    updateB();  
end Transaction  

这里,如果op#2失败,我希望op#1也被回滚。即完全回滚。

所以,我在Service层中编写了另外的方法,它调用了DAO方法。 在运行(Svc)代码之前,我手动[通过cmd-line]更改数据库上的一些数据,以便第二次操作由于DB约束而失败。

现在,op#2 [表-B] F​​AILS,但op#1在DB中提交。即没有完全回滚,只有部分回滚。

如果op#2失败,op#1是否也应该回滚?

以下是我在ApplicationContext.xml中使用的内容:

  • “DataSourceTransactionManager”[Spring] for Transaction。
  • iBatis 2.3.x [SqlMapClient]
  • Spring 3.0
  • DefaultAutoCommit设置为FALSE。
  • 在“tx:method”中:[要执行ATOMIC操作的服务方法)
    propagation =“REQUIRED”[尝试其他值,但没有用]
    rollback-for = Exception-Name-for-to-rollback

还有什么需要做的吗? 我做错了吗? 这是正确的方式还是有更好的选择?

1 个答案:

答案 0 :(得分:0)

<

在我看来,你应该考虑数据完整性,如果op#2使系统松散数据完整性,那么它应该根据op#1回滚。

要实现你想要的,只需在try / catch块上调用op#1和#2,包装器#2,类似于:

try {

    start Tranaction ;
    //pkA is primary key of A
    Object pkA = insertA();  
    updateA(pkA);  

    try {
        Object pkB = insertB(pkA); 
        updateB(pkB);  
    }
    catch(Exception e) {
        logger.ERROR("Error when inserting and updating B.Ignore. ",e);
    }
    commit transaction;
}
catch(Exception e) {
   logger.ERROR(e);
   rollback Transaction;
}

HTH。