葡京网投哪个正规 > 首页 > 事务说明,sql事物处理

原标题:事务说明,sql事物处理

浏览次数:107 时间:2020-05-08

asp教程.net 与 sql事物处理1:直接写入sql 直接写sql语句,sql语句笔者是足以有作业的,有事务管理的;在存储进度中选取begin tran,commit tran rollback tran。优点:独立于应用程序,具有运维三个事情的最棒品质。限定:事务管理的上下文仅设有于数据库教程调用中,数据库代码与数据库系统相关的; 2:通过ado.net完结大家说在.net当中呢,通过ado.net能够完毕事务管理;在ado.net中央银行使connection和transacion对象来支配职业,若要施行专门的学问请实行以下操作:调用connrction对象的begintransaction方法标志贰个职业的发端,将transaction对象分配给要实行的command的transaction属性,调用transaction对象的commit方法来产生业务,或调用rollback来废除事务;优点:轻松性,和数据库事务大约得快,独立于数据库。瑕玷:无法超越两个数据库,事务执行在数据库连接层上,所以要求在业务中尊敬多个数据库连接。 3:com+事务 在有些特定的状态下,大家要用的;日常的数据库事务调节供给作业里所做的操作必需在同二个数据库内,这就存在贰个难题,在遍及式应用程序中,我们再三要同有的时候候操作多少个数据库,sqlserver,oracle,mysql教程,你或者要操作多个数据库以致三个数据库,你也目的在于那一个操作照旧同期打响,要么同有的时候间战败,也便是她们要做贰个事情来管理,这种情状下就要用com+的布满式事务管理了; 下面提到的事务管理的中坚在于为了防范系统崩溃了,数据库再度运维后,仍旧保持数据的一致性,逻辑性; 不过其实事务还应该有一点在大家实际的行使中国和北美洲常关键的有些,举个例子:有个进销存系统,当买卖成功的时候,数据表order

1.什么是业务:事务是叁个不可分割的行事逻辑单元,在数据库系统上实行现身操作时职业是做为最小的决定单元来使用的。他带有的富有数据库操作命令作为一个总体一并向系提交或吊销,这一组数据库操作命令要么都实行,要么都不实行。 2.业务的语句 初步事物:BEGIN TRANSACTION 提交事物:COMMIT TRANSACTION 回滚事务:ROLLBACK TRANSACTION 3.事务的4个属性 ①原子性(Atomicity卡塔尔(قطر‎:事务中的全体因素作为二个全部提交或回滚,事务的个因素是不可分的,事务是多个安然无事操作。 ②一致性(ConsistemcyState of Qatar:事物完结时,数据必需是同一的,约等于说,和东西从头在此之前,数据存款和储蓄中的数据处于相通状态。保障数据的无损。 ③隔开分离性(Isolation卡塔尔国:对数据开展校勘的多少个专门的学业是相互隔开的。那声明职业必得是单身的,不应有以其余格局以来于或影响此外作业。 ④悠久性(DurabilityState of Qatar:事务完成今后,它对于系统的震慑是永世的,该改革就算出现系统故障也将直接保存,真实的改造了数据库 4.作业的保存点 SAVE TRANSACTION 保存点名称 --自定义保存点的名号和岗位 ROLLBACK TRANSACTION 保存点名称 --回滚到自定义的保存点 -------------------实------------------例---------------------------- BEGIN TRANSACTION--开始专门的学业 DECLARE @errorSun INT --定义错误计数器 SET @errorSun=0 --对的为0 UPDATE a SET id=232 WHERE a=1 --事务操作SQL语句 SET @errorSun=@errorSun+@@E奥迪Q7ROEnclave --累加是不是有错 UPDATE aa SET id=2 WHERE a=1 --事务操作SQL语句 SET @errorSun=@errorSun+@@ETiggoROQX56 --累加是还是不是有错 IF @errorSun0 BEGIN PHighlanderINT '有错误,回滚' ROLLBACK TRANSACTION--事务回滚语句 END ELSE BEGIN P福特ExplorerINT '成功,提交' COMMIT TRANSACTION--事务提交语句 END 示例:创制三个存款和储蓄进程,向四个表中并且插入数据 复制代码 代码如下: Create proc RegisterUser (@usrName varchar(30卡塔尔国, @usrPasswd varchar(30卡塔尔(قطر‎,@age int,@sex varchar(10卡塔尔(قطر‎, @PhoneNum varchar(20卡塔尔, @Address varchar(50卡塔尔国 卡塔尔 as begin begin tran insert into userinfo(userName,userPasswd卡塔尔 values(@usrName,@usrPasswd卡塔尔 if @@error0 begin rollback tran return -1 end insert into userdoc(userName,age,sex,PhoneNumber,Address卡塔尔国values(@Usrname,@age,@sex,@PhoneNum,@Address卡塔尔国if @@error0 begin rollback tran return -1 end commit tran return 0 end 事务的分类 按专门的事业的启航与执行措施,能够将事情分为3类: 显示事务 也称为客商定义或客商内定的专门的学业,即能够显式地定义运行和甘休的作业。布满式事务归属突显事务 自动提交业务 暗中认可事务管理格局。假若三个说话成功地做到,则交给该语句;假使蒙受错误,则回滚该语句。 隐性事务 当连接以此情势开展操作时,sql就要提交或回滚当前业务后自动运营新业务。无须描述事务的初始,只需提交或回滚各类事情。它生成接二连三的事务链。 一、展现事务 通过begin transacton、commit transaction、commit work、rollback transaction或rollback work等语句实现。 1、运维职业格式:begin tran 事务名或变量 with mark 描述 2、甘休工作 格式:commit tran 事务名或变量 (事务名与begin tran中的事务名一致 或commit work 但此未有参数 3、回滚事务 rollback tran 事务名或变量 | savepoint_name | savepoint_variable 或rollback work 表明:消逝自事务的源点或到有些保存点所做的富有数据改良4、在作行业内部安装保存点 格式:save tran savepoint_name | savepoint_variable 示例: 复制代码 代码如下: use bookdb go begin tran mytran insert into book values(9,"windows二零零二',1,22,'书局'卡塔尔(قطر‎ save tran mysave delete book where book_id=9 rollback tran mysave commit tran go select * from book go 能够知晓,下面的言语实践后,在book中插入了一笔记录,而并从未去除。因为运用rollback tran mysave 语句将操作回滚到了除去前的保存点处。 5、标识事务 格式:with mark 例:使用数据库标识将日志恢复生机到预约义时间点的语句 在专门的学业日志中置入一个标志。请小心,被标志的工作起码须提交八个创新,以标识该日记。 BEGIN TRAN My马克 WITH MA智跑K UPDATE pubs.dbo.LastLog马克 SET Mark提姆e = GETDATE(卡塔尔 COMMIT TRAN MyMark 遵照你常用的章程备份工作日志。 BACKUP LOG pubs TO DISK='C:BackupsFullbackup.bak' WITH INIT 现在你能够将数据库苏醒至日志标志点。首先苏醒数据库,并使其为选拔日志苏醒做好酌量。 RESTORE DATABASE pubs FROM DISK=N'C:BackupsFullbackup.bak' WITH NORECOVEPAJEROY 以往将日志苏醒至包涵该标志的时间点,并使其可供使用。请留意,STOPAT在数据库正在实施大体积日志时禁止实行。 RESTORE LOG pubs FROM DISK=N'C:BackupsLogbackup.bak' WITH RECOVERY, STOPAT='02/158%002 17:35:00' 5、无法用来工作的操作 创设数据库 create database 修正数据库 alter database 删除数据库 drop database 复苏数据库 restore database 加载数据库 load database 备份日志文件 backup log 恢复生机日志文件 restore log 更新总括数据 update statitics 授权操作 grant 复制事务日志 dump tran 磁盘开始化 disk init 更新使用sp_configure后的系列布置 reconfigure 二、自动提交业务 sql连接在begin tran 语句运维显式事务,或隐性事务形式设置为开采事情发生前,将以电动提交方式张开操作。当提交或回滚显式事务,或然关闭隐性事务格局时,将赶回到活动提交情势。 示例: 由于编写翻译错误,使得多少个insert都没实行 复制代码 代码如下: use test go create table testback(cola int primary key ,colb char(3State of QatarState of Qatar go insert into testback values(1,'aaa'State of Qatar insert into testback values(2,'bbb'State of Qatar insert into testback value(3,'ccc'卡塔尔 go select * from testback go 尚无此外结果回到 三、隐式事务 通过 API 函数或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务情势设置为开垦。下叁个话语自动运行一个新工作。当该业务完结时,再下一个Transact-SQL 语句又将开发银行二个新专门的学问。 当有恢宏的DDL 和DML命令实施时会自动开端,并直接维系到顾客显明提交截至,切换隐式事务能够用SET IMPLICIT_TRANSACTIONS 为连接装置隐性事务情势.当设置为 ON 时,SET IMPLICIT_TRANSACTIONS 将连接装置为隐性事务格局。当设置为 OFF 时,则使连接再次来到到自动提交业务情势 语句包涵: alter table insert open create delete revoke drop select fetch truncate table grant update 示例: 上面接受显式与隐式事务。它应用@@tracount函数演示展开的职业与关闭的作业: 复制代码 代码如下: use test go set nocount on create table t1(a int卡塔尔(قطر‎ go insert into t1 values(1卡塔尔(قطر‎ go print '使用显式事务' begin tran insert into t1 values(2卡塔尔(قطر‎ print '事务外的事情数目:'+cast(@@trancount as char(5卡塔尔(قطر‎卡塔尔 commint tran print '事务外的事体数目:'+cast(@@trancount as char(5State of Qatar卡塔尔国 go print go set implicit_transactions on go print '使用隐式事务' go insert into t1 values*4卡塔尔 print'事务内的事务数目:'+cast(@@trancount as char(5卡塔尔国卡塔尔国 commint tran print'事务外的事情数目:'+cast(@@trancount as char(5卡塔尔State of Qatar go 施行结果: 使用展现事务 事务内的政工数目:2 思想政治工作外的职业数目:1 行使隐式事务 事务内的作业数目:1 作业外的作业数目:0 四、布满式事务 凌驾多个或多少个数据库的单个sql server中的事务就是布满式事务。 与地方工作差异:必得由专门的职业微处理机管理,以尽量防止现身因互连网故障而变成三个政工由少数能源微处理机成功交付,但由另一对财富微机回滚的情状。 sql server 能够由DTc microsoft distributed transaction coordinator 来协处布满式事务,可以利用 BEgin distributed transaction 命令运营三个布满式事务管理 分二品级: A 希图阶段 B 提交阶段 施行教程: 1、sql 脚本或应用程序连接施行运维遍布式事务的sql语句 2、实施该语句的sql在为作业中的主要控战胜务器 3、脚本或应用程序对链接的服务器试行布满式查询,或对长间隔服务器实践长途存款和储蓄进程。 4、当推行了分布式查询或远程进度调用后,主要控打败务器将电动调用msdtc以便登记分布式事务中链接的服务器和远程服务器 5、当脚本或应用程序发出commit或rollback语句时,主控sql将调用msdtc管理两阶段提交进程,恐怕公告链接的服务器和长途服务器回滚其职业。 mssql 事务的叁个例证

本文转自:

作业操作的语法:begin transactionbegin distributed transactioncommit transactioncommit workrollback worksave transactionbegin transaction begin transaction标志一个显式本地专门的学业的早先点。

复制代码 代码如下:begin tran declare @rownum1 int --未增添订单的空房数 declare @rownum2 int --增添订单的空房数目 declare @BookID1 int set @BookID1=0 insert into T_BookRoomInfo(RoomID,CustomerName,CustomerCardID,Discount, EnterTime,DepositMoney,Memo,UserID,UpdTime) values (@RoomID,@CustomerName,@CustomerCardID,@Discount, getdate(),@DepositMoney,@Memo,@UserID,getdate()) select @BookID1=@@IDENTITY if(@BookID10) begin select @rownum1=count(1) from T_Room where IsEmploy=0 update T_Room set IsEmploy=1 where RoomID=@RoomID select @rownum1=count(1) from T_Room where IsEmploy=0

begin transaction将 @@trancount 加 1。

if(@rownum1=@rownum2) begin rollback tran end else begin commit tran end end else begin rollback tran end

sql事务(Transaction)用法介绍及回滚实例

begin transaction 代表一点,由连接引用的多寡在该点是逻辑和物理上都无差异的。若是遇上错误,在 begin transaction 之后的全数数据变动都能拓宽回滚,以将数据重临到已知的一律状态 。每一种业务继续实施直到它不易地成功同一时候用 commit transaction 对数据库作恒久的改观,可能遇上错误况兼用 rollback transaction 语句擦除全部改动

 

语法begin tran [ saction ] [ transaction_name | @tran_name_variable [ with mark [ 'description' ] ] ]

例子:begin tran t1update table1 ...--nest transaction m2begin tran m2 with markupdate table2 ...select * from table1commit tran m2update table3 ...commit tran t1

业务(Transaction)是并发调整的单位,是顾客定义的四个操作连串。那些操作如故都做,要么都不做,是叁个不可分割的干活单位。通过业务,SQL Server能将逻辑相关的一组操作绑定在同步,以便服务器保持数据的完整性

begin distributed transaction钦定三个由 microsoft 布满式事务管理和谐器 (ms dtc卡塔尔国 管理的 transact-sql 遍布式事务的原初。

 

语法begin distributed tran [ saction ][ transaction_name | @tran_name_variable ]

当对三个表张开立异的时候,某条奉行倒闭。为了保持数据的完整性,必要利用专门的学业回滚。 

参数transaction_name是顾客定义的事务名,用于追踪 ms dtc 实用工具中的分布式事务。 transaction_name 必需契合标记符法规,但是仅使用头 32 个字符

展现设置专门的工作

@tran_name_variable是客户定义的三个变量名,它包含一个事务名,该事务名用于跟踪ms dtc 实用工具中的布满式事务。必得用 char、varchar、nchar 或 nvarchar 数据类型评释该变量。

 代码如下

讲授施行begin distributed transaction 语句的服务器是工作成立人,况兼决定作业的做到

begin try   www.2cto.com  

当连接发出后续 commit transaction 或 rollback transaction 语句时,主要控战胜务器诉求 ms dtc 在所提到的劳务器间管理布满式事务的到位。有多个措施可将长途 sql 服务器登记在一个布满式事务中:

begin transaction 

布满式事务中已登记的接连几日奉行多个长途存款和储蓄进度调用,该调用征引壹当中远间距服务器。 布满式事务中已登记的总是试行一个布满式查询,该查询援引一个远程服务器。

insert into shiwu (asd) values ('aasdasda'); 

言传身教本例在地面和长间隔数据库上改过小编的姓。本地和远程数据库将同期提交或同临时候回滚本作业。

commit transaction 

证实 当前的sql server 上必需设置 ms dtc.

end try 

use pubsgobegin distributed transactionupdate authorsset au_lname = 'mcdonald' where au_id = '409-56-7008'execute link_server_t.pubs.dbo.changeauth_lname '409-56-7008','mcdonald'commit trangonote:

begin catch 

即使急需三回九转远程db,借使是linkserver 格局连接的话,应当要修该linkserver的 rpc 选项置为 true。

select ERROR_NUMBER() as errornumber 

set xact_abort钦赐当 transact-sql 语句发生运维时不那个时候,microsoft? sql server? 是还是不是自动回滚当前事情。

rollback transaction 

在布满式trans中自然要在意设置上边参数(xact_abort)

end catch

语法set xact_abort { on | off }

隐式设置专业

注释 当 set xact_abort 为 on 时,假设 transact-sql 语句产生运维时不当,整个业务将适度可止并回滚。为 off 时,只回滚发生错误的transact-sql 语句,而事情将延续举行拍卖。编写翻译错误不受 set xact_abort 的影响。

 代码如下

对于大超级多 ole db 提供程序,隐性或显式事务中的数据改进语句必需将 xact_abort 设置为 on。

set implicit_transactions on; -- 运营隐式事务 

set xact_abort 的装置是在实行或运维时设置,并不是在解析时设置。

go 

示例 下例以致在包蕴其他 transact-sql 语句的专门的工作中爆发违反外键错误。在首先个语句聚集发生错误,但其余语句均成功实施且专门的学问成功交付。在其次个语句集中,set xact_abort 设置为 on。那导致语句错误使批管理终止,并使业务回滚。

begin try 

create table t1 (a int primary key)create table t2 (a int references t1(a))goinsert into t1 values (1)insert into t1 values (3)insert into t1 values (4)insert into t1 values (6)goset xact_abort offgobegin traninsert into t2 values (1)insert into t2 values (2) /* foreign key error */insert into t2 values (3)commit trango

set xact_abort ongo

begin traninsert into t2 values (4)insert into t2 values (5) /* foreign key error */insert into t2 values (6)commit trango

save transaction

insert into shiwu (asd) values ('aasdasda'); 

在事情内安装保存点。

insert into shiwu (asd) values ('aasdasda'); 

语法 save tran [ saction ] { savepoint_name | @savepoint_variable }参数 savepoint_name是指使给保存点的称谓。保存点名称必得切合标志符法规,但只使用前 叁11个字符。@savepoint_variable是客商定义的、含有有效保存点名称的变量的名号。必得用 char、varchar、nchar 或 nvarchar 数据类型表明该变量。 注释顾客能够在业务内安装保存点或标记。保存点定义假若有原则地收回事务的一局地,事 务能够重临的职位。要是将业务回滚到保存点,则必需接二连三完结业务,或然必需完全撤除事务。若要撤销一切业务,请使用 rollback transaction transaction_name 格式。这将吊销事务的全数说话和进度。

commit transaction; 

note:1: 在由 begin distributed transaction 显式运营或从地点职业晋级而来的布满式事务中,不支持 save transaction。

end try 

2:当事务起初时,将间接决定专门的学问中所使用的能源直到职业达成。当将专门的学业的一有个别回滚到保存点时,将三番两次调整能源直到职业达成。

begin catch 

例子:begin transactionsave transaction ainsert into demo values('bb','b term')rollback transaction acreate table demo2(name varchar(10),age int)insert into demo2(name,age) values('lis',1)commit transaction

select ERROR_NUMBER() as errornumber 

rollback transaction; --回滚事务 

end catch 

set implicit_transactions off; --关闭隐式事务 

go

来得事务以下语句无法运用,隐式事务能够

 代码如下

alter database; 

backup;   www.2cto.com  

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  www.2cto.com  

也足以使用_ConnectionPtr 对象的办法: BeginTrans、CommitTrans、RollbackTrans,使用该类别函数判别并回滚。一旦调用了 BeginTrans 方法, 在调用 CommitTrans 或 RollbackTrans 停止专门的学问早先, 数据库将不再立刻提交所作的其余退换。

方案二

 代码如下

BEGIN TRANSACTION

INSERT INTO A   values  (4卡塔尔国   ----- 该表含有触发器,UPDATE其他表

IF @@error <> 0  --发生错误

   BEGIN

     ROLLBACK TRANSACTION

         

   END

ELSE

   BEGIN

     COMMIT TRANSACTION

       

   END

 

sql事务结合asp.net二种用法

在sql server+ .net 开辟条件下,有二种方法能够达成专业的操作,保持数据库的数据完整性;三个正是用sqlserver/42850.htm target=_blank >sql存储进度,另一个正是在ADO.NET中一种轻便的事务管理;以后通过一个标准的银行转账的事例来验证一下那五个例子的用法大家先来看看sql存款和储蓄进程是什么样来完毕职业的操作的:首先创立四个表:

 代码如下

create database aaaa --成立叁个表,包涵顾客的帐号和钱数gouse aaaacreate table bb( ID int not null primary key,  --帐号 moneys money    --转账金额)insert into bb values ('1','2001'卡塔尔国 --插入两条数据insert into bb values ('2','3000'卡塔尔用那么些表创造三个囤积进度:

create procedure mon --创造存款和储蓄进度,定义多少个变量

@toID int,    --接纳转账的账户

@fromID int ,  --转出本人的账户

@momeys money --转账的金额

as

begin tran --起首履行工作

 

update bb set moneys=moneys-@momeys where ID=@fromID -施行的率先个操作,转账出钱,减去转出的金额

update bb set moneys=moneys+@momeys where ID=@toID --施行第1个操作,采纳转账的金额,扩大  www.2cto.com  

 

if @@error<>0 --判定若是两条语句有其余一条现身谬误

begin rollback tran –早先试行工作的回滚,苏醒的倒车初始在此以前境况

return 0

end

go

 

else   --如何两条都进行成功

begin commit tran 试行那么些工作的操作

return 1

end

go

 

接下去看看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卡塔尔(قطر‎; //调用存款和储蓄进度

        cmd.CommandType = CommandType.StoredProcedure;

        con.Open();

        SqlParameter prar = new SqlParameter(卡塔尔;//传递参数

        cmd.Parameters.AddWithValue("@fromID", 1);

        cmd.Parameters.AddWithValue("@toID", 2);

        cmd.Parameters.AddWithValue("@momeys",Convert.ToInt32( TextBox1.Text) );

   www.2cto.com  

        cmd.Parameters.Add("@return", ""State of Qatar.Direction = ParameterDirection.ReturnValue;//获取存款和储蓄进程的重返值

        cmd.ExecuteNonQuery();

        string value = cmd.Parameters["@return"].Value.ToString(State of Qatar;//把再次回到值赋值给value

        if (value == "1")

        {

            Label1.Text = "增添成家立业";

        }

        else

        {

            Label1.Text = "增多退步";

       }

}

本条也正是在蕴藏进程里增加事务,再来看看不在数据库写sql存款和储蓄进度,ADO.NET是什么样处监护人务的:

 代码如下

protected void Button2_Click(object sender, EventArgs e)

    {

        SqlConnection con = new SqlConnection(@"Data Source=.SQLEXPRESS;database=aaaa;uid=sa;pwd=jcx");

        con.Open();

        SqlTransaction tran = con.BeginTransaction(卡塔尔国;//先实例SqlTransaction类,使用那一个工作使用的是con 那么些三番四次,使用BeginTransaction这些法子来初步推行那么些事情

        SqlCommand cmd = new SqlCommand();

        cmd.Connection = con;

        cmd.Transaction = tran;

        try

        {

             //在try{} 块里举办sqlcommand命令,

            cmd.CommandText = "update bb set moneys=moneys-'" + Convert.ToInt32(TextBox1.Text) + "' where ID='1'";

            cmd.ExecuteNonQuery();

            cmd.CommandText = "update bb set moneys=moneys+' aa ' where ID='2'";

            cmd.ExecuteNonQuery();

            tran.Commit(State of Qatar;//倘使三个sql命令都执行成功,则实行commit那一个主意,试行那一个操作

   www.2cto.com  

            Label1.Text = "增加功成业就";

        }

        catch

        {

            Label1.Text = "增多战败";

            tran.Rollback(卡塔尔国;//怎么样实践不成事,爆发极其,则进行rollback方法,回滚到职业操作起来在此之前;

        }

 

    }

那便是四个职业分裂用法的差不离例子,ADO.NET 事务管理的方法看起来比较容易,不过她要接收同二个总是来实施这个操作,固然同有的时候间利用多少个数据库来用多少个事情推行,那样就对比烦琐,可是如若用sql存款和储蓄进度,那样就绝比较较轻松

 

 

 

有心人研商了下,开采sql server里面包车型大巴explicit transaction依然有一点复杂的。以下是有个别计算:

·         Commit transaction 会提交所有嵌套的transaction校勘。然而如果嵌套的transaction里面有rollback tran to save point, 那么save point之后的有个别会revert掉。

delete from dbo.numbertable

begin tran out1

     insert into dbo.numbertable values(1)

     insert into dbo.numbertable values(2)

    

     begin tran inn1

          insert into dbo.numbertable values(3)

          insert into dbo.numbertable values(4)

     save tran inn1SavePoint

          insert into dbo.numbertable values(5)

     rollback tran inn1SavePoint

     commit tran inn1

commit tran out1

 

·         @@TRANCOUNT能够用来记录当前session transaction的个数,对于嵌套的transaction来说,每趟begin transaction都让它加一,每一次commit tran都会让它减一。所以在讲话里面能够因而select @@TRANCOUNT 来检查当前是否在二个transaction里面。如若当前@@TRANCOUNT为0,那调用commit照旧rollback都会现身语句错误。在嵌套的transaction里面,rollback是很新鲜的,它会向来把@@TRANCOUNT设置为0。

begin tran

begin tran

begin tran

print @@trancount

rollback tran

print @@trancount

 

·         对于嵌套的transaction来说,rollback的写法是很非常。倘诺嵌套,rollback transaction后边是不能够带transaction的name的,要带也只能是最外侧的transaction的name。Rollback只会舍弃全部嵌套transaction在rollback语句以前的改造。Rollback之后的翻新依然提交就去了,原因在于:rollback之后,@@trancount为0,那么rollback之后的讲话就不归属explicit transaction, 归属autocmmit transaction了,自动提交。

delete from dbo.numbertable

begin tran t1

     insert into dbo.numbertable values(1)

    

     begin tran t2

          insert into dbo.numbertable values(2)

     rollback tran

     print 'after rollback in innert transaction, the transaction count is: '+cast(@@trancount, varchar(5))

     insert into dbo.numbertable values(3)

--commit tran

select * from dbo.numbertable

 

·         存款和储蓄进度之中也足以begin transaction,就算调用的地点也begin transaction,那么这种意况也归属嵌套transaction,如若在蕴藏进程之中rollback,得到的结果和地点相同。可是有一点点破例的地点在与,推行存款和储蓄进程甘休的时候会相比起来实施sp的@@trancount和得了时候@@trancount的值,假如不相仿,它会提交一个音信像“Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.”那几个给出的音信并不会影响以往的实施。

CREATE PROCEDURE [dbo].[AddNumber]       

AS

BEGIN

     begin tran

          insert into dbo.numbertable values(1)

          insert into dbo.numbertable values(2)

          insert into dbo.numbertable values(3)

     rollback tran

END

delete from dbo.numbertable

begin tran out1

exec dbo.addnumber

print @@trancount

insert into dbo.numbertable values(3)

select * from dbo.numbertable

事务说明,sql事物处理。 

·         假设在sp里面rollback了,那到外满做commit, 大概rollback都以尚未效果与利益还要出错了,因为嵌套的transaction内部transaction一旦调用了rollback,@@trancount就为0了,在外满commit,rollback直接出错。举例如下sp,我想像在最外面rollback,那就出错了,因为sp里面语句rollback了。表里面始终会插入值3。

delete from dbo.numbertable

葡京网投哪个正规 ,begin tran out1

exec dbo.addnumber

print @@trancount

insert into dbo.numbertable values(3)

rollback tran out1

select * from dbo.numbertable

 

·         全部对于嵌套的transaction来说,就算中间transaction一旦rollback,就能给外界的transaction留下八个秀茂坪。为了化解那么些为题,有三种减轻方案:

1.       在外表的transaction里面检查@@trancount,假诺那么些值跟你代码begin tran的能够同样,那表达内部transaction未有rollback,那能够世襲commit恐怕rollback。

delete from dbo.numbertable

葡京正网网投 ,begin tran t1

     insert into dbo.numbertable values(1)

    

     begin transaction t2

          insert into dbo.numbertable values(2)

     rollback tran

 

     if @@trancount = 1

     begin

          insert into dbo.numbertable values(3)

          commit tran

     end

2.       在有着的内部transaction里面,只好commit,不能够rollback。借使必需rollback,那如何做?save point就足以派上用途了。举例sp改成这样子:

ALTER PROCEDURE [dbo].[AddNumber]        

AS

BEGIN

     begin tran

     save tran pp

          insert into dbo.numbertable values(1)

          insert into dbo.numbertable values(2)

          insert into dbo.numbertable values(3)

     rollback tran pp

     commit tran

END

 

begin tran out1

exec dbo.addnumber

print @@trancount

insert into dbo.numbertable values(3)

commit tran out1

 

 

 

 

本文由葡京网投哪个正规发布于首页,转载请注明出处:事务说明,sql事物处理

关键词:

上一篇:表中重复记录语句,查询和删除重复字段数据的方法

下一篇:取最大值和最小值语句,摘自sql官方文档葡京网投哪个正规: