事务回滚锁表问题

我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 出错, 就会报 事务无 回滚 或者 提交,然后就把表锁死了。。。
难道不能这样写?
...全文
175 5 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
自己先顶
课程简介: 课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图+实战的方式讲解。 第一部分:彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景和事例来讲解。 第二部分:实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读、MVCC精讲。 第三部分:彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED 读已提交隔离级别、REPEATABLE_READ 可重复度隔离级别、SERIALIZABLE 序列化隔离级别 第四部分:彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 第五部分:彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED分布式事务的理论基础:RPC定理、BASE理论、XA协议都是什么,原理是什么,有什么关联关系 第六部分:分布式事务的5种解决方案原理和优缺点:2PC两阶段提交法、3PC三阶段提交法、TCC事务补偿、异步确保策略、最大努力通知策略 第七部分:阿里巴巴分布式事务框架Seata:历经多年双十一,微服务分布式事务框架,用一个Nacos+Spring Cloud+Seta+MySql的微服务项目,实战讲解阿里的分布式事务技术,深入理解和学习Seata的AT模式、TCC模式、SAGA模式。 课程资料: 课程附带配套2个项目源码72页高清PDF课件一份阿里巴巴seata-1.1.0源码一份阿里巴巴seata-server安装包一份

34,588

社区成员

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

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