`

begin tran commit tran

 
阅读更多
BEGIN TRANSACTION ON 表示一个事物的开启
COMMIT TRANSACTION  表示一个事物的结束



问题

begin   tran;

insert   into   TabA   values(1);

insert   into   TabB   values(1);

commit   tran;

想的是两个插入操作要么同时成功,   要么   rollback.

但发现它的执行结构却是:

------------------------------------------------------------------------------------
服务器:   消息   2627,级别   14,状态   1,行   1
违反了   PRIMARY   KEY   约束   'PK_tabA '。不能在对象   'TabA '   中插入重复键。
语句已终止。

(所影响的行数为   1   行)
第一条语句因为主键约束,   插入失败.

而第二条语句成功了.   faint.
如果这样的话,   那   begin   tran/commit   tran   语句还有什么用?

马可回复:
begin   tran;

insert   into   TabA   values(1);

if   @@error   <>   0     rollback
insert   into   TabB   values(1);
if   @@error   <>   0     rollback


commit   tran;

易水寒回复:

begin   trans
    insert   into   tableA   values(1)
    if   @@error> 0   or   @@rowcount <> 1  
          goto   NeedRollBack
     
    insert   into   tableB   values(2)
   
    NeedRollBack:
    if   @@error> 0   or   @@rowcount <> 1
            rollback   tran
    esle
            commit   tran

邹建回复:
--如果要用判断错误的方法处理,应该这样做:

--测试的表
create   table   tb(
id   int     not   null     constraint   PK_sys_zj_fielddict   primary   key
        ,aa   int)

--事务处理
begin   tran
insert   into   tb   values(1,1)
if   @@error <> 0   goto   lb_rollback
insert   into   tb   values(1,1)
if   @@error <> 0   goto   lb_rollback
insert   into   tb   values(2,1)
if   @@error <> 0   goto   lb_rollback
insert   into   tb   values(2,1)
if   @@error <> 0   goto   lb_rollback
insert   into   tb   values(3,1)
if   @@error <> 0   goto   lb_rollback
lb_commit:
commit   tran
goto   lb_ok
lb_rollback:
rollback   tran

--显示结果
lb_ok:
select   *   from   tb
drop   table   tb



邹建回复:
(马可)   和  (易水寒)   的方法是不能处理的,两位可以自行测试一下

而设置:
SET   XACT_ABORT   on
的方法可以做到回滚整个事务,达到楼主的要求,但要注意一点:

--创建测试表
create   table   tb(
id   int     not   null     constraint   PK_sys_zj_fielddict   primary   key
        ,aa   int)

--设置选项
SET   XACT_ABORT   on

--事务处理
begin   tran
insert   into   tb   values(1,1)
insert   into   tb   values(1,1)
insert   into   tb   values(2,1)
commit   tran

--显示结果
/*--------注意
        如果这样写的话,后面的语句不会被执行,如果要执行后面的语句,要在这句后面加上GO,仅查询分析分析器支持,所以如果是在存储过程中,要保证commit   tran后面没有其他语句,否则出错时,其他语句不会被执行
-----------*/
select   *   from   tb
drop   table   tb



分享到:
评论

相关推荐

    SQL事务用法begin tran,commit tran和rollback tran的用法

    `BEGIN TRAN`、`COMMIT TRAN` 和 `ROLLBACK TRAN` 是SQL Server中用于管理事务的主要命令。下面将详细解释这些命令的用法和作用。 1. `BEGIN TRAN`: `BEGIN TRAN` 语句用于启动一个新的事务。当开始一个事务时,...

    Sql Server数据库事务介绍

    Sql Server2005/2008提供了begin tran、commit tran和rollback tran三个语句来显示地使用事务。begin tran表示事务开始,commit tran表示事务提交,rollback tran表示事务回滚。例如: ```sql begin try begin tran...

    在存储过程中编写正确的事务处理代码(SQL_Server_2000_.doc

    BEGIN TRAN UPDATE statement 1 ... UPDATE statement 2 ... DELETE statement 3 ... COMMIT TRAN ``` 2. **检查@@ERROR变量**:在每个DML(数据修改语言)语句后检查`@@ERROR`变量,如果非零则表示有错误发生。...

    php+mysql事务rollback&amp;commit示例

    2. 手动提交模式:通过执行`BEGIN`或`START TRANSACTION`语句,或显式设置`SET autocommit=0`,可以进入手动提交模式,在这个模式下,需要程序员手动执行`COMMIT`或`ROLLBACK`来控制事务的提交或回滚。 在事务的...

    安全与完整性的数据保存:PowerBuilder和SQL Server的应用.pdf

    SQL Server通过Begin Tran语句来控制同一个批次的Transaction中的多个SQL语句及其处理的数据,通过Commit Tran和Rollback Tran语句来保证它们被全部处理成功后才提交,或者当该组中的任一个或多个处理失败时被全部回...

    SQL Server中解决死锁的新方法介绍

    begin tran insert into Orders(CustomerId) values(@#ALFKI@#) waitfor delay @#00:00:05@# select * from Orders where CustomerId = @#ALFKI@# commit print @#end tran@# ``` 在 SQL Server 中,解决死锁的...

    数据库实验四 SJK存储过程实验

    - 使用`begin tran`和`commit/rollback tran`语句来控制事务的开始与结束。 - 通过`@@ERROR`系统变量来判断是否有错误发生,从而决定是否回滚事务。 - 最后通过`select`语句验证数据是否正确插入。 ##### 2. 修改...

    ssh用户管理系统

    tran = session.beginTransaction(); id = session.save(u); tran.commit(); }catch(Exception exp){ exp.printStackTrace(); tran.rollback(); }finally{ if(null != null) session.close(); } ...

    Sql Server事务语法及使用方法实例分析

    通过使用`BEGIN TRAN`, `COMMIT TRAN`, `ROLLBACK TRAN`和`SAVE TRAN`,开发者可以精确控制数据库更新,防止因错误或异常导致的数据不一致。在实际开发中,合理使用事务有助于构建健壮、可靠的数据库应用程序。

    C#:支持多种数据库,SqlServer,MsSql,MySql,ODBC,OleDb,Access,Oracle,Sqlite

    da.BeginTran(); try { da.Exec("delete from tab1 where id = @id", DbParameter[]); da.Exec("delete from tab2 where id = @id", DbParameter[]); da.CommitTran(); } catch { da.RollbackTran(); }

    c#事务的运用

    SQL事务是指在SQL Server中直接通过`BEGIN TRAN`, `ROLLBACK TRAN`, 和 `COMMIT TRAN`语句来控制事务。这种方式执行效率高,但其局限性在于事务上下文仅限于数据库内部,不适用于涉及多个数据库操作或复杂业务逻辑...

    Asp.Net事务和异常处理 (一)

    - **SQL语句控制**:可以直接在SQL语句中使用`BEGIN TRAN`, `COMMIT TRAN`, `ROLLBACK TRAN`来控制事务。例如,创建一个存储过程,其中包含开始事务、删除操作、检查错误、根据错误状态提交或回滚事务的逻辑。 在...

    SQL Server存储过程中编写事务处理的方法小结

    BEGIN TRAN UPDATE statement 1 ... UPDATE statement 2 ... DELETE statement 3 ... COMMIT TRAN ``` 如果`UPDATE statement 1`引发错误,整个事务将被回滚,不会执行后面的语句。 2. 在每个DML语句后检查`...

    SQL SERVER 2005 新增的几个小功能

    3. **事务管理**:通过`BEGIN TRAN`开始一个新的事务,在`COMMIT TRAN`中提交事务,在`ROLLBACK TRAN`中回滚事务。 **优点**: - **增强错误处理能力**:能够捕获并处理运行时错误,确保应用程序的稳定性和可靠性。...

    SQL Server实用脚本

    - `BEGIN TRAN` 开始一个新的事务。 - `BEGIN TRY...BEGIN CATCH` 结构用于事务内的错误处理。 - `ROLLBACK TRAN` 在出现错误时回滚当前事务。 - `COMMIT TRAN` 提交当前事务。 ### 3. 日志备份与数据库收缩 **...

    哈工大数据库系统概论--系统篇.pptx

    在SQL Server 2000中,可以使用类似BEGIN TRAN、COMMIT TRAN和ROLLBACK TRAN的语法,同时也支持SQL-92标准的定义方式。事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。COMMIT表示提交事务,将所有更改...

    数据库实用编程手册

    8. 事务管理:BEGIN TRAN、COMMIT TRAN、ROLLBACK TRAN等。 9. 分区表:优化大数据量表的查询和维护。 10. 集群和复制技术:提供高可用性和灾难恢复解决方案。 通过深入理解和熟练掌握这些知识点,无论是开发应用...

Global site tag (gtag.js) - Google Analytics