USE BFSDB
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'up_InsertBFSBusinessInfo')
BEGIN
DROP  Procedure  up_InsertBFSBusinessInfo
ENDGO/******************************************************************************
** File: up_InsertBFSBusinessInfo.Sql
** Name: up_InsertBFSBusinessInfo
** Desc: 添加CPC请求的业务信息
** Return Value:
**
** Auth: 
** Date: 2008-04-23
*******************************************************************************
** Change History
*******************************************************************************
** Date: Author: Description:
** -------- -------- ---------------------------------------
**    
*******************************************************************************/
CREATE Procedure up_InsertBFSBusinessInfo
(
@BusinessGuid varchar(50) , -- 系统内部编号
@CPCXmlData text , -- CPC报文数据
@TransCode varchar(4) , -- 交易码
@InitBranchId varchar(4) , -- 流程发起机构号
@InitUserId varchar(8) , -- 流程发起柜员号
@TransactionDate varchar(20) , -- 当前日期
@BusinessId varchar(20) , -- 业务流水号
@BusinessType varchar(5) , -- 业务种类
@BusinessInitBranchId varchar(4) , -- 业务发起机构号
@ExchangeDate varchar(8) , -- 交换日期
@ExchangeRound varchar(1) , -- 交换场次
@ImageFilePath varchar(100) , -- 影像路径
@ImageFileName varchar(1000) , -- 影像名称
@CurrencyType varchar(3) , -- 币种
@VoucherType varchar(2), -- 票据种类
@VoucherNo varchar(12) , -- 票据号码
@PayeeAccountNo varchar(32) , -- 收款人账号
@PayeeFullName varchar(62) , -- 收款人名称
@PayerAccountNo varchar(32) , -- 出票人账号
@PayerFullName varchar(62) , -- 出票人名称
@Amount decimal(18,2) , -- 金额
@VoucherIssueDate varchar(8) , -- 出票日期
@PaymentCode varchar(16) , -- 支付密码
@ExchangeBranchId varchar(12) , -- 提出行行号
@ExchangeInBranchNo varchar(12) , -- 提回行行号
@PaperFlag varchar(1) , -- 纸票标志
@Comments varchar(60) , -- 注释
@MaxEndorseIndex varchar(3) , -- 最大粘单索引
@SopSSN varchar(12) , -- 柜员流水号
@ProcessBeginTime datetime, --处理开始时间
@ProcessEndTime datetime, --处理结束时间
@ProcessStatus int , -- 处理状态
@Re text -- 描述
)AS
BEGIN TRANSACTION Tran_BFS1declare @n int
select @n=count(*) from BFS_BusinessInfo  with (nolock) where  BusinessId= @BusinessIdif (@n>0)
begin 
  
   --删除已存在的影像存储信息
delete from  BFS_ImageStoreInfo
where BusinessGuid=(
select BusinessGuid from BFS_BusinessInfo  with (nolock) 
where  BusinessId= @BusinessId )

endIF (@@ERROR<>0)
begin
ROLLBACK TRANSACTION Tran_BFS1
  return 100
end
ELSE 
COMMIT TRANSACTION Tran_BFS1BEGIN TRANSACTION Tran_delete
if (@n>0)
begin 
  --删除已存在的业务信息
delete from  BFS_BusinessInfo
where BusinessId=@BusinessId 
end
IF (@@ERROR<>0)
begin
ROLLBACK TRANSACTION Tran_delete
return 100
end
ELSE 
COMMIT TRANSACTION Tran_deleteBEGIN TRANSACTION Tran_BFS2
--添加一条新记录insert into BFS_BusinessInfo with (rowlock)
(
BusinessGuid,
CPCXmlData,
TransCode ,
InitBranchId,
InitUserId ,
TransactionDate ,
BusinessId ,
BusinessType ,
BusinessInitBranchId ,
ExchangeDate ,
ExchangeRound ,
ImageFilePath ,
ImageFileName,
CurrencyType,
VoucherType ,
VoucherNo ,
PayeeAccountNo,
PayeeFullName ,
PayerAccountNo,
PayerFullName ,
Amount,
VoucherIssueDate ,
PaymentCode ,
ExchangeBranchId ,
ExchangeInBranchNo ,
PaperFlag ,
Comments ,
MaxEndorseIndex ,
SopSSN ,
ProcessBeginTime,
ProcessEndTime,
ProcessStatus,
Re )
values
(
@BusinessGuid,
@CPCXmlData,
@TransCode ,
@InitBranchId,
@InitUserId ,
@TransactionDate ,
@BusinessId ,
@BusinessType ,
@BusinessInitBranchId ,
@ExchangeDate ,
@ExchangeRound ,
@ImageFilePath ,
@ImageFileName,
@CurrencyType,
@VoucherType ,
@VoucherNo ,
@PayeeAccountNo,
@PayeeFullName ,
@PayerAccountNo,
@PayerFullName ,
@Amount,
@VoucherIssueDate ,
@PaymentCode ,
@ExchangeBranchId ,
@ExchangeInBranchNo ,
@PaperFlag ,
@Comments ,
@MaxEndorseIndex ,
@SopSSN ,
@ProcessBeginTime,
@ProcessEndTime,
@ProcessStatus ,
@Re )

IF (@@ERROR<>0) 
ROLLBACK TRANSACTION Tran_BFS2 
ELSE 
COMMIT TRANSACTION Tran_BFS2returnGO 请大家帮我看看上面的存储过程,会发生死锁吗?
如果会发生要怎么解决。谢谢了。

解决方案 »

  1.   

    光看 一个过程是看不出来是否死锁的。。要结合整个数据库系统进行。。而且发生死锁的情况也不一定是某个时刻
      

  2.   

    一般都是事务的提交与回滚的匹配问题
    慢慢查一查
      

  3.   

    这个存储过程之前是只有一个事务的,现在我分成三个事务了,
    这个方法是不是笔只有一个事务强点。
      

  4.   

    建议不要再事务中使用创建数据库,删除数据库的操作
    不要使用过于复杂的判断在你的事务中
    在比较复杂的环境中测试你的程序,会显露出在简单环境中发现不了的问题
      

  5.   

    应从整体数据库考虑是否有死锁发生。