如下代码:
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'
------解决方案--------------------
因为它在begin tran里面,其实它已经insert了,但是由于属于一个事务,所以也一并回滚掉
------解决方案--------------------
我又执行了一次上面的语句,返回:
/*
(1 行受影响)
(1 行受影响)
消息 547,级别 16,状态 0,第 28 行
UPDATE 语句与 CHECK 约束"CK__account__balance__286302EC"冲突。该冲突发生于数据库"pubs",表"dbo.account", column 'balance'。
语句已终止。
(1 行受影响)
(1 行受影响)
回滚事务成功
*/
说明上面的update语句执行时由于违反了check约束,导致报错,但还是继续往下执行了,但由于有错误所以@totalErr>0 所以,最后还是回滚了。
所以显示了“回滚事务成功”。