【www.gdgbn.com--php与数据库】

asp教程.net 与 sql事物处理
1:直接写入sql
   直接写sql语句,sql语句本身是可以有事务的,有事务处理的;在存储过程中使用begin tran,commit tran rollback tran。优点:独立于应用程序,拥有运行一个事务的最佳性能(在存储过程写事务处理是性能最好的)。限制:事务处理的上下文仅存在于数据库教程调用中(事务处理只能在sql语句中体现,如果在sql语句之外是无法访问的),数据库代码与数据库系统相关的(因为是sql语句当中进行的事务处理,不同的数据库写的方法不一样);
   2:通过ado.net实现
   我们说在.net当中呢,通过ado.net可以实现事务处理;在ado.net中使用connection和transacion对象来控制事务,若要执行事务请执行以下操作:调用connrction对象的begintransaction方法标记一个事务的开始(begintransaction返回一个transaction对象),将transaction对象分配给要执行的command的transaction属性(将这个tranaction对象赋值给command对象的transaction属性),调用transaction对象的commit方法来完成事务,或调用rollback来取消事务;优点:简单性,和数据库事务差不多得快,独立于数据库。缺点:不能跨越多个数据库,事务执行在数据库连接层上,所以需要在事务中维护一个数据库连接。
   3:com+事务(分布式事务)
   在某些特定的情况下,我们要用的;一般的数据库事务控制要求事务里所做的操作必须在同一个数据库内(必须对同一个数据库进行操作),这就存在一个问题,在分布式应用程序中,我们往往要同时操作多个数据库,sqlserver,oracle,mysql教程,你可能要操作两个数据库甚至多个数据库,你也希望这些操作要么同时成功,要么同时失败,也就是他们要做一个事务来处理,这种情况下就要用com+的分布式事务处理了;
   上面提到的事务处理的核心在于为了防止系统崩溃了,数据库再次启动后,仍然保持数据的一致性,逻辑性;
   不过其实事务还有一点在我们实际的应用中非常重要的一点,比如:有个进销存系统,当采购成功的时候,数据表order

事务操作的语法:
begin transaction
begin distributed transaction
commit transaction
commit work
rollback work
save transaction
begin transaction
begin transaction
标记一个显式本地事务的起始点。

begin transaction将 @@trancount 加 1。

begin transaction 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 begin transaction 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态 。每个事务继续执行直到它无误地完成并且用 commit transaction 对数据库作永久的改动,或者遇上错误并且用 rollback transaction 语句擦除所有改动

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

例子:
begin tran t1
update table1 ...
--nest transaction m2
begin tran m2 with mark
update table2 ...
select * from table1
commit tran m2
update table3 ...
commit tran t1

 

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 语句的服务器是事务创建人,并且控制事务的完成

当连接发出后续 commit transaction 或 rollback transaction 语句时,
主控服务器请求 ms dtc 在所涉及的服务器间管理分布式事务的完成。
有两个方法可将远程 sql 服务器登记在一个分布式事务中:

分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。
分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。

示例
本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。

说明
当前的sql server 上必须安装 ms dtc.

use pubs
go
begin distributed transaction
update authors
set au_lname = "mcdonald" where au_id = "409-56-7008"
execute link_server_t.pubs.dbo.changeauth_lname "409-56-7008","mcdonald"
commit tran
gonote:


如果需要连接远程db,如果是linkserver 方式连接的话,一定要修该linkserver的 rpc 选项置为 true。

set xact_abort
指定当 transact-sql 语句产生运行时错误时,microsoft? sql server? 是否自动回滚当前事务。

在分布式trans中一定要注意设置下面参数(xact_abort)

语法set xact_abort { on | off }

注释 当 set xact_abort 为 on 时,如果 transact-sql 语句产生运行时错误,整个事务将终止并回滚。为 off 时,只回滚产生错误的transact-sql 语句,而事务将继续进行处理。编译错误(如语法错误)不受 set xact_abort 的影响。

对于大多数 ole db 提供程序(包括 sql server),隐性或显式事务中的数据修改语句必须将 xact_abort 设置为 on。

set xact_abort 的设置是在执行或运行时设置,而不是在分析时设置。

示例 下例导致在含有其它 transact-sql 语句的事务中发生违反外键错误。在第一个语句集中产生错误,但其它语句均成功执行且事务成功
提交。在第二个语句集中,set xact_abort 设置为 on。这导致语句错误使批处理终止,并使事务回滚。

create table t1 (a int primary key)
create table t2 (a int references t1(a))
go
insert into t1 values (1)
insert into t1 values (3)
insert into t1 values (4)
insert into t1 values (6)
go
set xact_abort off
go
begin tran
insert into t2 values (1)
insert into t2 values (2) /* foreign key error */
insert into t2 values (3)
commit tran
go

set xact_abort on
go

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

 

save transaction

在事务内设置保存点。

语法 save tran [ saction ] { savepoint_name | @savepoint_variable }
参数 savepoint_name
是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前 32 个字符。
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称。
必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。 注释
用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事 务可以返回的位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的 transact-sql 语句和 commit transaction 语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要取消整个事务,请使用 rollback transaction transaction_name 格式。这将撤消事务的所 有语句和过程。

note:1: 在由 begin distributed transaction 显式启动或从本地事务升级而来的分布式事务中,不支持 save transaction。

2:当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。

例子:begin transaction
save transaction a
insert into demo values("bb","b term")
rollback transaction a
create table demo2(name varchar(10),age int)
insert into demo2(name,age) values("lis",1)
commit transaction

本文来源:http://www.gdgbn.com/jiaocheng/28862/