Skip to content

概述

TIP

事务在整个顶层设计中,具有多处体现。
在SQLBuilder层,通过添加:DisPosable接口,实现了事务的功能,具化了基础的事务能力。
在BatchSQL层,通过SQL语句的批量积累和执行,能够在不扩展影响范围的情况下,最终时刻一次性提交所有变化。
在实体执行层,通过UnitOfWork类,实现了仓储模式下的事务支持。

WARNING

基于SQLBuilder的事务,目前已实现生态打通:
kit.beginTransaction()后,相应的useClip useRepo 方法,能够传递事务。 基于kit的扩展方法 insert/update/delete实体类套件,同样传递了事务。
insertList的批量插入,同样传递事务。

SQLBuilder

SQLBuilder类作为一个综合用户侧入口,事务功能默认具有传递性,即:

  • 开启事务后,所有的后续操作都会在一个事务中执行。包括创建的Clip、实体类的直接操作、开启的仓储类等
  • 提交事务后,所有的操作都会提交到数据库。同时,销毁事务上下文。
  • 回滚事务后,所有的操作都会回滚到数据库。
  • 为保证能够被正确的释放资源,建议使用using语句来开启事务,这样能够确保事务在使用完成后,能够被正确的释放资源。

beginTransaction

开启事务,开启事务,此后的所有的操作在commit前都会在一个事务中

c#
kit.beginTransaction();

commit

提交事务,如果autoRollBack为true则在执行出错时自动回滚

c#
kit.commit();

useTransaction

传递事务,传递事务,将当前的事务传递给下一个操作,下一个操作会在当前事务中执行。

WARNING

只建议在深度熟悉底层实现时使用,防止误用导致扩大事务范围。

c#
kit.useTransaction(transaction);

综合使用案例

c#
using (kit) { 
    kit.beginTransaction();
    foreach (var bill in bills) { 
        kit.clear()
            .setTable("table")
            .set("DATE", bill.SendStart)
            .where("OID", bill.DueInCoalOID)
            .doUpdate();
        cc++;
    }
    if (cc > 0) { 
        kit.commit();
    }
}

BatchSQL

具体见BatchSQL

工作单元

具体见工作单元