日期:2014-05-17  浏览次数:20412 次

关于SQL存储过程事务处理
一个存储过程
MSIL code
CREATE PROCEDURE ProductOrderSplit 
@SELL_IDSN int,
@SplitNumber int

AS

begin tran

declare @SELL_ID varchar(100)
declare @OrderNoteSN int




[s]
sele
C# code
public int SplitProduct(int SELL_IDSN, int SplitNumber)
        {
            SqlConnection sqlConn = HunryCommon.DataAccess.GetConnection();
            sqlConn.Open();
            SqlTransaction sqlTrans = sqlConn.BeginTransaction();
            try
            {
                SqlParameter [] commandParameters = new SqlParameter[2];
                commandParameters[0] = new SqlParameter("@SELL_IDSN",SqlDbType.Int);
                commandParameters[0].Value = SELL_IDSN;
                commandParameters[1] = new SqlParameter("@SplitNumber",SqlDbType.Int);
                commandParameters[1].Value = SplitNumber;
                HunryCommon.DataAccess.ExecuteScalar(sqlTrans,CommandType.StoredProcedure,"ProductOrderSplit",commandParameters);
                sqlTrans.Commit();
                sqlConn.Close();
                return 1;
            }
            catch(SqlException ex)
            {
                string ss=ex.ToString();
                sqlTrans.Rollback();
                sqlConn.Close();
                return 0;//有异常 
            }
        }

第一个问题存储过程写的怎么样,还有什么要改进没,谢谢指点
第二个问题我不知道在存储过程用事务处理,在代码中也用事务处理有必要吗

------解决方案--------------------
查询的时候不需要加锁,因为查询是用的共享锁,插入和更新时需要加锁,再者
再insert的时候,改为:insert into C_SENDPRODUCTDETAIL with(updlock)。。。。

第二个问题,如果存储过程中有事务处理,那程序中不需要再加了
------解决方案--------------------
最好在每个对数据库操作的语句后都加上出错判断,另外注意显性事务与隐性事务的区别,
你应该在操作数据之前打开显性事务,结束时关闭