zoukankan      html  css  js  c++  java
  • 使用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


  • 相关阅读:
    asp.net 导出excel的一种方法
    微软通过.NET Native为Windows Store应用提速
    .NET基金会成立
    XDomainRequest object
    转 web.config设置之system.webServer 详细介绍,为网站设置默认文档
    P·C·L 了解
    无法对 数据库'XXXXX' 执行 删除,因为它正用于复制
    web性能优化
    web 分享代码片段
    Microsoft OWIN
  • 原文地址:https://www.cnblogs.com/buguge/p/2290526.html
Copyright © 2011-2022 走看看