我前端开发的程序没有采用自动提交
begin transction
update table_name1 set ....
if sqlcode <> 0 rollback; update table_name2 set ....
if sqlcode <> 0 rollback;
update table_name3 set ....
if sqlcode <> 0 rollback;
commit transaction现在的问题是,比如所当执行到语句 1 的使用,客户端死机。mssqlserver服务是回滚还是提交该记录。
我知道,如果是Oracle,这样的update语句会被回滚的。而我们的mssqlserver现场服务器好像是给预提交
而不是回滚
我们的sqlserver2005企业版32位的。
大家有没有遇到这方面的事情?
begin transction
update table_name1 set ....
if sqlcode <> 0 rollback; update table_name2 set ....
if sqlcode <> 0 rollback;
update table_name3 set ....
if sqlcode <> 0 rollback;
commit transaction现在的问题是,比如所当执行到语句 1 的使用,客户端死机。mssqlserver服务是回滚还是提交该记录。
我知道,如果是Oracle,这样的update语句会被回滚的。而我们的mssqlserver现场服务器好像是给预提交
而不是回滚
我们的sqlserver2005企业版32位的。
大家有没有遇到这方面的事情?
begin tran
[update语句1]
[update语句2]
[update语句3]
commit tran
#2. 死机时,例如执行到了SQL1。如果这时两边的连接断了,那么SQL SERVER应该会发现并回滚,如果没有断,应该会继续执行。
#3.有了SET XACT_ABOR选项应该,楼主可以少写点儿代码了
set xact_abort on
官方解释:它用于指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。 如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。 OFF 是默认设置。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 访问接口(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。 唯一不需要该选项的情况是在提供程序支持嵌套事务时。
只会回滚出错的语句,前面已经执行的不会回滚。所以使用 SET XACT_ABOR比较保险。
一条一条语句执行的。只是在每条语句后面会判断是否有错误。
现在发现是在执行语句1 或语句2之后死机。这个时候语句3还没被执行,数据还没有
被更改,但是语句1的update或语句2的update已经提交了。百思不得其解
create table testrollback(id int primary key, name varchar(10))begin tran
insert into testrollback values (1,'test')
WAITFOR DELAY '00:01';
insert into testrollback values (2,'test')
commit tran 比如执行到20秒的时候你断开客户端跟服务器的链接,然后登陆服务器看一下其实已经插入了一条数据,但是数据库无法连接到客户端的时候,SQL Server会回滚整个事物,你会发现第一条记录又没了。
create table testrollback(id int primary key, name varchar(10))begin tran
insert into testrollback values (1,'test')
WAITFOR DELAY '00:01';
insert into testrollback values (2,'test')
commit tran 比如执行到20秒的时候你断开客户端跟服务器的链接,然后登陆服务器看一下其实已经插入了一条数据,但是数据库无法连接到客户端的时候,SQL Server会回滚整个事物,你会发现第一条记录又没了。
你这种是批指令。我是在cs程序的客户端开一个事务,一条一条语句执行的。按ms的理论是没有问题,但实际却如我说的那样。把前面两句的提交了。没有回滚
set xact_abort on
begin tran
update语句1
update语句2
update语句3
commit tran这个xact_abort的特点在于,只要update中的任一语句更新失败,都会自动回滚的,你就不用在update后,每次都需要判断一下,是否有错误了