2023年6月21日发(作者:)

sql事务(Transaction)⽤法介绍及回滚实例事务(Transaction)是并发控制的单位,是⽤户定义的⼀个操作序列。这些操作要么都做,要么都不做,是⼀个不可分割的⼯作单位。通过事务,SQL Server能将逻辑相关的⼀组操作绑定在⼀起,以便服务器保持数据的完整性当对多个表进⾏更新的时候,某条执⾏失败。为了保持数据的完整性,需要使⽤事务回滚。

显⽰设置事务代码如下 复制代码

begin try

begin transaction

insert into shiwu (asd) values (‘aasdasda’);

commit transaction

end try

begin catch

select ERROR_NUMBER() as errornumber

rollback transaction

end catch

隐式设置事务代码如下 复制代码

set implicit_transactions on; – 启动隐式事务

go

begin try

insert into shiwu (asd) values (‘aasdasda’);

insert into shiwu (asd) values (‘aasdasda’);

commit transaction;

end try

begin catch

select ERROR_NUMBER() as errornumber

rollback transaction; –回滚事务

end catch

set implicit_transactions off; –关闭隐式事务

go显⽰事务以下语句不能使⽤,隐式事务可以代码如下 复制代码

alter database;

backup;

create database;

drop database;

reconfigure;

restore;

update statistics;显⽰事务可以嵌套使⽤代码如下 复制代码

–创建存储过程

create procedure qiantaoProc

@asd nchar(10)

as

begin

begin try

begin transaction innerTrans

save transaction savepoint –创建事务保存点

insert into shiwu (asd) values (@asd);

commit transaction innerTrans

end try

begin catch

rollback transaction savepoint –回滚到保存点

commit transaction innerTrans

end catch

end

go

begin transaction outrans

exec qiantaoProc ‘asdasd’;

rollback transaction outrans

事务嵌套,回滚外层事务时,如果嵌套内的事务已经回滚过则会有异常。此时需要使⽤事务保存点。如下实例SQL事务回滚指定当 Transact-SQL 语句产⽣运⾏时错误时,Microsoft® SQL Server™ 是否⾃动回滚当前事务⽅案⼀:代码如下 复制代码

SET XACT_ABORT ON–如果产⽣错误⾃动回滚

GO

BEGIN TRAN

INSERT INTO A VALUES (4)

INSERT INTO B VALUES (5)

COMMIT TRAN

也可以使⽤_ConnectionPtr 对象的⽅法: BeginTrans、CommitTrans、RollbackTrans,使⽤该系列函数判断并回滚。⼀旦调⽤了BeginTrans ⽅法, 在调⽤ CommitTrans 或 RollbackTrans 结束事务之前, 数据库将不再⽴即提交所作的任何更改。

⽅案⼆代码如下 复制代码

BEGIN TRANSACTION

INSERT INTO A values (4) —– 该表含有触发器,UPDATE其他表

IF @@error <> 0 –发⽣错误

BEGIN

ROLLBACK TRANSACTIONEND

ELSE

BEGIN

COMMIT TRANSACTIONENDsql事务结合两种⽤法在sql server+ .net 开发环境下,有两种⽅法能够完成事务的操作,保持数据库的数据完整性;⼀个就是⽤sqlserver/get=_blank >sql存储过程,另⼀个就是在中⼀种简单的事务处理;现在通过⼀个典型的银⾏转账的例⼦来说明⼀下这两个例⼦的⽤法我们先来看看sql存储过程是如何来完成事务的操作的:⾸先创建⼀个表:代码如下 复制代码

create database aaaa –创建⼀个表,包含⽤户的帐号和钱数gouse aaaacreate table bb( ID int not null primary key, –帐号moneys money –转账⾦额)insert into bb values (‘1’,’2000’) –插⼊两条数据insert into bb values (‘2’,’3000’)⽤这个表创建⼀个存储过程:

create procedure mon –创建存储过程,定义⼏个变量@toID int, –接收转账的账户@fromID int , –转出⾃⼰的账户@momeys money –转账的⾦额asbegin tran –开始执⾏事务update bb set moneys=moneys-@momeys where ID=@fromID -执⾏的第⼀个操作,转账出钱,减去转出的⾦额update bb set moneys=moneys+@momeys where ID=@toID –执⾏第⼆个操作,接受转账的⾦额,增加if @@error<>0 –判断如果两条语句有任何⼀条出现错误begin rollback tran –开始执⾏事务的回滚,恢复的转账开始之前状态return 0endgoelse –如何两条都执⾏成功begin commit tran 执⾏这个事务的操作return 1endgo接下来看看C#.net 是如何调⽤这个存储过程的:代码如下 复制代码

protected void Button1_Click(object sender, EventArgs e){ SqlConnection con =new SqlConnection(@"Data Source=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); //连接字符串 SqlCommand cmd = new SqlCommand("mon",con); //调⽤存储过程 dType = Procedure; (); SqlParameter prar = new SqlParameter();//传递参数 hValue("@fromID", 1); hValue("@toID", 2); hValue("@momeys",32( ) ); ("@return", "").Direction = Value;//获取存储过程的返回值 eNonQuery(); string value = ters["@return"].ng();//把返回值赋值给value if (value == "1") { = "添加成功"; } else { = "添加失败"; }}这个也就是在存储过程⾥添加事务,再来看看不在数据库写sql存储过程,是如何处理事务的:代码如下 复制代码

protected void Button2_Click(object sender, EventArgs e){ SqlConnection con = new SqlConnection(@"Data Source=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); (); SqlTransaction tran = ransaction();//先实例SqlTransaction类,使⽤这个事务使⽤的是con 这个连接,使⽤BeginTransaction这个⽅法来开始执⾏这个事务 SqlCommand cmd = new SqlCommand(); tion = con; ction = tran; try { //在try{} 块⾥执⾏sqlcommand命令, dText = "update bb set moneys=moneys-'" + 32() + "' where ID='1'"; eNonQuery(); dText = "update bb set moneys=moneys+' aa ' where ID='2'"; eNonQuery(); ();//如果两个sql命令都执⾏成功,则执⾏commit这个⽅法,执⾏这些操作 = "添加成功"; } catch { = "添加失败"; ck();//如何执⾏不成功,发⽣异常,则执⾏rollback⽅法,回滚到事务操作开始之前; }}这就是两个事务不同⽤法的简单例⼦, 事务处理的⽅法看起来⽐较简单,但是他要使⽤同⼀个连接来执⾏这些操作,要是同时使⽤⼏个数据库来⽤⼀个事务执⾏,这样就⽐较繁琐,但是要是⽤sql存储过程,这样就相对⽐较简单

2023年6月21日发(作者:)

sql事务(Transaction)⽤法介绍及回滚实例事务(Transaction)是并发控制的单位,是⽤户定义的⼀个操作序列。这些操作要么都做,要么都不做,是⼀个不可分割的⼯作单位。通过事务,SQL Server能将逻辑相关的⼀组操作绑定在⼀起,以便服务器保持数据的完整性当对多个表进⾏更新的时候,某条执⾏失败。为了保持数据的完整性,需要使⽤事务回滚。

显⽰设置事务代码如下 复制代码

begin try

begin transaction

insert into shiwu (asd) values (‘aasdasda’);

commit transaction

end try

begin catch

select ERROR_NUMBER() as errornumber

rollback transaction

end catch

隐式设置事务代码如下 复制代码

set implicit_transactions on; – 启动隐式事务

go

begin try

insert into shiwu (asd) values (‘aasdasda’);

insert into shiwu (asd) values (‘aasdasda’);

commit transaction;

end try

begin catch

select ERROR_NUMBER() as errornumber

rollback transaction; –回滚事务

end catch

set implicit_transactions off; –关闭隐式事务

go显⽰事务以下语句不能使⽤,隐式事务可以代码如下 复制代码

alter database;

backup;

create database;

drop database;

reconfigure;

restore;

update statistics;显⽰事务可以嵌套使⽤代码如下 复制代码

–创建存储过程

create procedure qiantaoProc

@asd nchar(10)

as

begin

begin try

begin transaction innerTrans

save transaction savepoint –创建事务保存点

insert into shiwu (asd) values (@asd);

commit transaction innerTrans

end try

begin catch

rollback transaction savepoint –回滚到保存点

commit transaction innerTrans

end catch

end

go

begin transaction outrans

exec qiantaoProc ‘asdasd’;

rollback transaction outrans

事务嵌套,回滚外层事务时,如果嵌套内的事务已经回滚过则会有异常。此时需要使⽤事务保存点。如下实例SQL事务回滚指定当 Transact-SQL 语句产⽣运⾏时错误时,Microsoft® SQL Server™ 是否⾃动回滚当前事务⽅案⼀:代码如下 复制代码

SET XACT_ABORT ON–如果产⽣错误⾃动回滚

GO

BEGIN TRAN

INSERT INTO A VALUES (4)

INSERT INTO B VALUES (5)

COMMIT TRAN

也可以使⽤_ConnectionPtr 对象的⽅法: BeginTrans、CommitTrans、RollbackTrans,使⽤该系列函数判断并回滚。⼀旦调⽤了BeginTrans ⽅法, 在调⽤ CommitTrans 或 RollbackTrans 结束事务之前, 数据库将不再⽴即提交所作的任何更改。

⽅案⼆代码如下 复制代码

BEGIN TRANSACTION

INSERT INTO A values (4) —– 该表含有触发器,UPDATE其他表

IF @@error <> 0 –发⽣错误

BEGIN

ROLLBACK TRANSACTIONEND

ELSE

BEGIN

COMMIT TRANSACTIONENDsql事务结合两种⽤法在sql server+ .net 开发环境下,有两种⽅法能够完成事务的操作,保持数据库的数据完整性;⼀个就是⽤sqlserver/get=_blank >sql存储过程,另⼀个就是在中⼀种简单的事务处理;现在通过⼀个典型的银⾏转账的例⼦来说明⼀下这两个例⼦的⽤法我们先来看看sql存储过程是如何来完成事务的操作的:⾸先创建⼀个表:代码如下 复制代码

create database aaaa –创建⼀个表,包含⽤户的帐号和钱数gouse aaaacreate table bb( ID int not null primary key, –帐号moneys money –转账⾦额)insert into bb values (‘1’,’2000’) –插⼊两条数据insert into bb values (‘2’,’3000’)⽤这个表创建⼀个存储过程:

create procedure mon –创建存储过程,定义⼏个变量@toID int, –接收转账的账户@fromID int , –转出⾃⼰的账户@momeys money –转账的⾦额asbegin tran –开始执⾏事务update bb set moneys=moneys-@momeys where ID=@fromID -执⾏的第⼀个操作,转账出钱,减去转出的⾦额update bb set moneys=moneys+@momeys where ID=@toID –执⾏第⼆个操作,接受转账的⾦额,增加if @@error<>0 –判断如果两条语句有任何⼀条出现错误begin rollback tran –开始执⾏事务的回滚,恢复的转账开始之前状态return 0endgoelse –如何两条都执⾏成功begin commit tran 执⾏这个事务的操作return 1endgo接下来看看C#.net 是如何调⽤这个存储过程的:代码如下 复制代码

protected void Button1_Click(object sender, EventArgs e){ SqlConnection con =new SqlConnection(@"Data Source=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); //连接字符串 SqlCommand cmd = new SqlCommand("mon",con); //调⽤存储过程 dType = Procedure; (); SqlParameter prar = new SqlParameter();//传递参数 hValue("@fromID", 1); hValue("@toID", 2); hValue("@momeys",32( ) ); ("@return", "").Direction = Value;//获取存储过程的返回值 eNonQuery(); string value = ters["@return"].ng();//把返回值赋值给value if (value == "1") { = "添加成功"; } else { = "添加失败"; }}这个也就是在存储过程⾥添加事务,再来看看不在数据库写sql存储过程,是如何处理事务的:代码如下 复制代码

protected void Button2_Click(object sender, EventArgs e){ SqlConnection con = new SqlConnection(@"Data Source=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx"); (); SqlTransaction tran = ransaction();//先实例SqlTransaction类,使⽤这个事务使⽤的是con 这个连接,使⽤BeginTransaction这个⽅法来开始执⾏这个事务 SqlCommand cmd = new SqlCommand(); tion = con; ction = tran; try { //在try{} 块⾥执⾏sqlcommand命令, dText = "update bb set moneys=moneys-'" + 32() + "' where ID='1'"; eNonQuery(); dText = "update bb set moneys=moneys+' aa ' where ID='2'"; eNonQuery(); ();//如果两个sql命令都执⾏成功,则执⾏commit这个⽅法,执⾏这些操作 = "添加成功"; } catch { = "添加失败"; ck();//如何执⾏不成功,发⽣异常,则执⾏rollback⽅法,回滚到事务操作开始之前; }}这就是两个事务不同⽤法的简单例⼦, 事务处理的⽅法看起来⽐较简单,但是他要使⽤同⼀个连接来执⾏这些操作,要是同时使⽤⼏个数据库来⽤⼀个事务执⾏,这样就⽐较繁琐,但是要是⽤sql存储过程,这样就相对⽐较简单