事务回滚锁表问题

我2我骄傲 2012-03-06 10:05:10
create proc usp_ChangeHander                   
@UserGUID VARCHAR(40),
@EventGUID VARCHAR(40),
@WorkL money,
@Ru VARCHAR(40), --更改的人
@remarks VARCHAR(4000)

AS
DECLARE @count int
DECLARE @strDepartment VARCHAR(40)
DECLARE @strUserName VARCHAR(10)
DECLARE @strGW VARCHAR(20)
DECLARE @strDepartmentSelf VARCHAR(40)
DECLARE @strUserNameSelf VARCHAR(10)
DECLARE @strGWSelf VARCHAR(20)

DECLARE @date VARCHAR(24)
begin
SET @date = getdate()
SET @count =0
BEGIN TRANSACTION
--SET @count = 0

--SELECT @strUserName =UserName, @strDepartment=CONVERT(varchar(40),DepartmentGUID),@strGW =JobTitle FROM myuser WHERE USERGUID = @UserGUID
SELECT @strUserName =UserName,@strDepartment=RoleOrgName,@strGW =RoleName FROM [v_OrgRoleUser] WHERE USERGUID = @UserGUID --接受的人
SELECT @strUserNameSelf =UserName,@strDepartmentSelf=RoleOrgName,@strGWSelf =RoleName FROM [v_OrgRoleUser] WHERE USERGUID = @Ru --更改的人

BEGIN
---插入数据到处理过程
INSERT INTO Itsm_ProcessReport (ProcessGUID,EventGUID,ProcessTime,ProcessContent,Hander,Receiver,Remarks) VALUES (newid(),@EventGUID,@date,'更改处理人',@strUserNameSelf,@strUserName,@remarks)
SET @count = @count + @@ERROR
END
BEGIN
---插入数据到工作量表
INSERT INTO Itsm_WorkLoad (WorkLoadGUID,EventGUID,UserName,Department,WorkQuatity,WorkGw,IsZf,Remarks) VALUES (newid(),@EventGUID,@strUserNameSelf,@strDepartmentSelf,@WorkL,@strGWSelf,0,'更改处理人')
SET @count = @count + @@ERROR
END
BEGIN
---更新事件单信息
UPDATE Itsm_EventInfo SET NowHandlerGUID=@UserGUID WHERE EventGUID=@EventGUID
SET @count = @count + @@ERROR
END
print @count
IF @count<>0
begin
ROLLBACK TRANSACTION
SELECT 'FAILED'
end
ELSE
begin
COMMIT TRANSACTION
SELECT 'SUCCESS'
end
end


我想问下,我的这个事务如果第一个insert 出错, 就会报 事务无 回滚 或者 提交,然后就把表锁死了。。。
难道不能这样写?
...全文
182 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独加百列 2012-03-06
  • 打赏
  • 举报
回复
每个语句处理下,跳转一下就可以了

create proc usp_ChangeHander
@UserGUID VARCHAR(40),
@EventGUID VARCHAR(40),
@WorkL money,
@Ru VARCHAR(40), --更改的人
@remarks VARCHAR(4000)

AS
DECLARE @count int
DECLARE @strDepartment VARCHAR(40)
DECLARE @strUserName VARCHAR(10)
DECLARE @strGW VARCHAR(20)
DECLARE @strDepartmentSelf VARCHAR(40)
DECLARE @strUserNameSelf VARCHAR(10)
DECLARE @strGWSelf VARCHAR(20)

DECLARE @date VARCHAR(24)
begin
SET @date = getdate()
SET @count =0
set xact_abort on
BEGIN TRANSACTION
--SET @count = 0

--SELECT @strUserName =UserName, @strDepartment=CONVERT(varchar(40),DepartmentGUID),@strGW =JobTitle FROM myuser WHERE USERGUID = @UserGUID
SELECT @strUserName =UserName,@strDepartment=RoleOrgName,@strGW =RoleName FROM [v_OrgRoleUser] WHERE USERGUID = @UserGUID --接受的人
SELECT @strUserNameSelf =UserName,@strDepartmentSelf=RoleOrgName,@strGWSelf =RoleName FROM [v_OrgRoleUser] WHERE USERGUID = @Ru --更改的人

BEGIN
---插入数据到处理过程
INSERT INTO Itsm_ProcessReport (ProcessGUID,EventGUID,ProcessTime,ProcessContent,Hander,Receiver,Remarks) VALUES (newid(),@EventGUID,@date,'更改处理人',@strUserNameSelf,@strUserName,@remarks)
SET @count = @@ERROR
IF @count <> 0
BEGIN
SELECT '插入数据到处理过程失败!'
GOTO ERRORHANDLE
END
END
BEGIN
---插入数据到工作量表
INSERT INTO Itsm_WorkLoad (WorkLoadGUID,EventGUID,UserName,Department,WorkQuatity,WorkGw,IsZf,Remarks) VALUES (newid(),@EventGUID,@strUserNameSelf,@strDepartmentSelf,@WorkL,@strGWSelf,0,'更改处理人')
SET @count = @@ERROR
IF @count <> 0
BEGIN
SELECT '插入数据到工作表失败!'
GOTO ERRORHANDLE
END
END
BEGIN
---更新事件单信息
UPDATE Itsm_EventInfo SET NowHandlerGUID=@UserGUID WHERE EventGUID=@EventGUID
SET @count = @@ERROR
IF @count <> 0
BEGIN
SELECT '更新事件单信息失败!'
GOTO ERRORHANDLE
END
END
print @count


COMMIT TRANSACTION
SELECT 'SUCCESSED'
RETURN 100

ERRORHANDLE:
ROLLBACK TRANSACTION
SELECT 'FAILED'
RETURN -100
我2我骄傲 2012-03-06
  • 打赏
  • 举报
回复
谢谢喽上的两位,我在想 是不是 要把 三条语句 加在一个 begin end 里面

而不是三个 begin end ,这有关系吗?
唐诗三百首 2012-03-06
  • 打赏
  • 举报
回复
try this,

create proc usp_ChangeHander
@UserGUID VARCHAR(40),
@EventGUID VARCHAR(40),
@WorkL money,
@Ru VARCHAR(40), --更改的人
@remarks VARCHAR(4000)

AS
DECLARE @count int
DECLARE @strDepartment VARCHAR(40)
DECLARE @strUserName VARCHAR(10)
DECLARE @strGW VARCHAR(20)
DECLARE @strDepartmentSelf VARCHAR(40)
DECLARE @strUserNameSelf VARCHAR(10)
DECLARE @strGWSelf VARCHAR(20)

DECLARE @date VARCHAR(24)
begin
SET @date = getdate()
SET @count =0
set xact_abort on
BEGIN TRANSACTION
--SET @count = 0

--SELECT @strUserName =UserName, @strDepartment=CONVERT(varchar(40),DepartmentGUID),@strGW =JobTitle FROM myuser WHERE USERGUID = @UserGUID
SELECT @strUserName =UserName,@strDepartment=RoleOrgName,@strGW =RoleName FROM [v_OrgRoleUser] WHERE USERGUID = @UserGUID --接受的人
SELECT @strUserNameSelf =UserName,@strDepartmentSelf=RoleOrgName,@strGWSelf =RoleName FROM [v_OrgRoleUser] WHERE USERGUID = @Ru --更改的人

BEGIN
---插入数据到处理过程
INSERT INTO Itsm_ProcessReport (ProcessGUID,EventGUID,ProcessTime,ProcessContent,Hander,Receiver,Remarks) VALUES (newid(),@EventGUID,@date,'更改处理人',@strUserNameSelf,@strUserName,@remarks)
SET @count = @count + @@ERROR
END
BEGIN
---插入数据到工作量表
INSERT INTO Itsm_WorkLoad (WorkLoadGUID,EventGUID,UserName,Department,WorkQuatity,WorkGw,IsZf,Remarks) VALUES (newid(),@EventGUID,@strUserNameSelf,@strDepartmentSelf,@WorkL,@strGWSelf,0,'更改处理人')
SET @count = @count + @@ERROR
END
BEGIN
---更新事件单信息
UPDATE Itsm_EventInfo SET NowHandlerGUID=@UserGUID WHERE EventGUID=@EventGUID
SET @count = @count + @@ERROR
END
print @count
IF @count<>0
begin
ROLLBACK TRANSACTION
SELECT 'FAILED'
end
ELSE
begin
COMMIT TRANSACTION
SELECT 'SUCCESS'
end
end
jyh070207 2012-03-06
  • 打赏
  • 举报
回复
将 BEGIN TRANSACTION 更改为SET XACT_ABORT ON
我2我骄傲 2012-03-06
  • 打赏
  • 举报
回复
自己先顶

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧