使用TransactionScope类定义代码块以参与事务

如下为一个保存出库单的code,先向header表插入数据,再将商品信息(goods)插入到detail表中。 为了保证数据的完整性,增加了事务控制,即TransactionScope(.netframework 4.0)。

在TransactionScope区域里面所有的ACTION都在这个事务里面。操作可以是同一个数据库,也可以多个数据库(可以不同机器)。

若没有执行 tran.Complete() 或者在执行 tran.Complete() 前发生了异常都将产生回滚,即回滚到初始状态。

public string AddOutput(Output_Th m)
{
    string io_num = "";
    using (TransactionScope tran = new TransactionScope(TransactionScopeOption.Required,
        new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
    {
        io_num = this.Writer.Insert("InOutStockDao.AddOutput", m).ToString(); //保存出库单据,返回值为出库单号 执行,但不提交到数据库

        if (!string.IsNullOrEmpty(io_num))
        {
            foreach (var detail in m.GoodsList)//遍历出库单里各商品
            {
                detail.io_num = io_num;
                this.Writer.Insert("InOutStockDao.AddStockIODetails", detail);//保存出库单里的商品信息 执行,但不提交到数据库
            }
        }

        tran.Complete();//submit 这时才把整个事务涉及到的数据提交到数据库
    }
    return io_num;
}

ibatIS中的sqlmap:

<!--新增出库单,向Output_Th表插入数据-->
<insert id="AddOutput" parameterClass="Output_Th">
declare @maxNo varchar(20)
select @maxNo='O'+RIGHT('00000'+ CAST(CAST(isnull(max(right(io_num,5)),0) as int)+1 as varchar),5) from output_Th

INSERT INTO [dbo].[output_Th]([io_num], [c_num], [e_num], [op_num], [date], [PayType], [qty], [amt], [CreateDate])

  VALUES  (@maxNo, #c_num#, #e_num#, #op_num#, #Date#, #PayType#, #qty#, #amt#, GETDATE())
  <selectKey property="io_num" type="post" resultClass="string">
select max(io_num) as io_num from output_Th
</selectKey>
</insert>


<!--新增出库单/入库单时,保存产品时,向IOput_Td表插入数据-->
<insert id="AddStockIODetails" parameterClass="StockIODetails">
INSERT INTO [dbo].[IOput_Td] ([io_num], [g_num], [qty], [amt], [price], [CreateDate])
VALUES (#io_num#, #g_num#, #qty#, #amt#, #price#, GETDATE())
</insert>

以下为通过sqlserver的profiler监测到的sql:

exec sp_executesql N'
declare @maxNo varchar(20)
select @maxNo=
''O''+RIGHT(''00000''+ CAST(CAST(isnull(max(right(io_num,5)),0) as int)+1 as varchar),5) from output_Th
INSERT INTO [dbo].[output_Th] ([io_num] ,[c_num] ,[e_num] ,[op_num] ,[date] ,[PayType] ,[qty] ,[amt] ,[CreateDate])
VALUES (@maxNo , @param0 , @param1 , @param2 , @param3 , @param4 , @param5 , @param6 ,GETDATE())
',N'@param0 int,@param1 nvarchar(4000),@param2 nvarchar(4000),@param3 datetime,@param4 nvarchar(4000),@param5 decimal(1,0),@param6 decimal(1,0)',@param0=0,@param1=NULL,@param2=NULL,@param3='2011-12-16 11:27:47.6400000',@param4=NULL,@param5=0,@param6=0

select max(io_num) as io_num from output_Th
go

exec sp_reset_connection
go

exec sp_executesql N'
INSERT INTO [dbo].[IOput_Td] ([io_num] ,[g_num] ,[qty] ,[amt] ,[price] ,[CreateDate])
VALUES ( @param0 , @param1 , @param2 , @param3 , @param4 ,GETDATE())
',N'@param0 nvarchar(6),@param1 int,@param2 decimal(1,0),@param3 decimal(1,0),@param4 decimal(1,0)',@param0=N'O00004',@param1=1,@param2=0,@param3=0,@param4=0
go



 


当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/archive/2011/12/16/2290526.html


原文地址:https://www.cnblogs.com/buguge/p/2290526.html