当前位置: 代码迷 >> Sql Server >> SQL 数据库中的 提交事务的疑难有关问题
  详细解决方案

SQL 数据库中的 提交事务的疑难有关问题

热度:47   发布时间:2016-04-24 19:57:23.0
SQL 数据库中的 提交事务的疑难问题
如下代码:

create table account   
(
name varchar(20) primary key,
balance money not null
check (balance>=1)
)

create table logger  ---相当于是日志文件 
(
nameFrom varchar(20) not null,
nameTo varchar(20) not null,
num money not null,
time datetime not null
)


insert into account values('aaa',1000)
insert into account values('bbb',1)

declare @totalErr int
set @totalErr=0
begin transaction          --开始事务
update account set balance=balance-1000 where name='aaa'
set @totalErr=@totalErr+@@ERROR
update account set balance=balance+1000 where name='bbb'         
set @totalErr=@totalErr+@@ERROR

insert into logger values('aaa','bbb',1000,GETDATE())   ----为什么执行后,最后查询此表没有数据显示?
set @totalErr=@totalErr+@@ERROR
if @totalErr>0
begin
 rollback transaction--回滚事务
print '回滚事务成功'
end
else
begin
commit transaction--提交事务
end


高手看下,为什么最后查询此表logger 中的数据没哟数据显示?

谢谢回复!
SQL 数据库 事务

------解决方案--------------------
执行你的代码有报错:
The UPDATE statement conflicted with the CHECK constraint "CK__account__balance__3C69FB99".

也就是说你的update语句失败了,所以事务回滚,insert也不成功
------解决方案--------------------
因为你的udpate报这个错误:

消息 547,级别 16,状态 0,第 7 行
UPDATE 语句与 CHECK 约束"CK__account__balance__023D5A04"冲突。该冲突发生于数据库"pubs",表"dbo.account", column 'balance'。
语句已终止。


------解决方案--------------------
因为你的表account中有check约束:

create table account   
(
name varchar(20) primary key,
balance money not null
check (balance>=1)  --这里有check约束
)

那么在执行下面的update语句是,由于name为aaa的记录的balance是1000,那么再减掉1000后,就变成0了,于是不满足上面的balance>=1的约束,所以直接报错,由于是比较严重的额错误,就不会继续下去,直接回滚了:
update account set balance=balance-1000 where name='aaa'
------解决方案--------------------
引用:
___但是就此题、
   insert into logger values('aaa','bbb',1000,GETDATE())
   insert此句代码是在执行‘rollback transaction’回滚之前、
  也就是先已经执行了insert代码,那为什么还是没有数据?
因为它在begin tran里面,其实它已经insert了,但是由于属于一个事务,所以也一并回滚掉
------解决方案--------------------
引用:
___但是就此题、
   insert into logger values('aaa','bbb',1000,GETDATE())
   insert此句代码是在执行‘rollback transaction’回滚之前、
  也就是先已经执行了insert代码,那为什么还是没有数据?


我又执行了一次上面的语句,返回:
/*

(1 行受影响)

(1 行受影响)
消息 547,级别 16,状态 0,第 28 行
UPDATE 语句与 CHECK 约束"CK__account__balance__286302EC"冲突。该冲突发生于数据库"pubs",表"dbo.account", column 'balance'。
语句已终止。

(1 行受影响)

(1 行受影响)
回滚事务成功

*/

说明上面的update语句执行时由于违反了check约束,导致报错,但还是继续往下执行了,但由于有错误所以@totalErr>0 所以,最后还是回滚了。

所以显示了“回滚事务成功”。
  相关解决方案