如何使用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] FAILS,但op#1在DB中提交。即没有完全回滚,只有部分回滚。
如果op#2失败,op#1是否也应该回滚?
以下是我在ApplicationContext.xml中使用的内容:
还有什么需要做的吗? 我做错了吗? 这是正确的方式还是有更好的选择?
答案 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。