关于sql事务,达人指点下.

来源:百度知道 编辑:UC知道 时间:2024/06/09 08:01:39
test 数据库中有table2这样一个表,三个字段,a,b,c都为int型,现有一行数据,都为1
我写了如下sql语句:
use test
go
begin tran
print'更新前的数据'
select * from tablv2/*此处故意写错表名,以使事务不能成功*/
go
set nocount on
update table2 set b=10,c=10 where a=1
if @@rowcount=0
print'没有行被更新'
else print'行已被更新'
go
print'更新后的数据'
select * from table2
go
commit
可以说,所有的过程就是一个事务,我故意写错了表名,但为什么数据还是被修改了,这是怎么回事?不太懂了,达人指点下.我的运行结果是这样的:

更新前的数据
服务器: 消息 208,级别 16,状态 1,行 1
对象名 'tablv2' 无效。
行已被更新
更新后的数据
a b c
----------- ----------- -----------
1 10 10
我只想通过此例对事务有一个整体的理解,别无他意,请达人不要从这道题上思考,而从事务的整体性上去思考.换句话说,我想问,为什么这个事务的语句不是共同进退的?即不遵循要么全部执行,要么全部不执行的原则?俺是初学者,望大家不要笑俺.

事务是不会自己回滚的
需要你自己在代码里通过
begin try 和 end try捕获产生的错误
然后在begin catch 和 end catch 块中使用rollback语句让事务回滚

你可以简单地先写个小例子试一下,体会下rollback的用法
比如:
begin tran
update table2 set b=10,c=10 where a=1
rollback tran
就会发现数据没有被更新

然后再结合begin try end try begin catch end catch的用法
就能实现在事务执行过程中出错后回滚的功能

大概的形式就是这样:
begin tran
begin try
--做相关操作
--结束的时候如果没有错误则用commit提交事务
commit tran
end try
begin catch
--出现错误的时候会跳转到这里
--用rollback回滚事务
rollback tran
end catch

判断后。加个return
要不程序继续执行。
你为什么不用@@error判断

或者
if
...........
rollback transaction
else
commit transaction

1.你的更新逻辑有问题。
程序在顺序执行的时候
update table2 set b=10,c=10 where a=1
if @@rowcount=0
print'没有行被更新'
else print'行已被更新'
会显示被更新,因为你的确更新了数据
然后查询数据
print'更新后的数据'
select * from table2
go
最后commi