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
分享到:
相关推荐
`BEGIN TRAN`、`COMMIT TRAN` 和 `ROLLBACK TRAN` 是SQL Server中用于管理事务的主要命令。下面将详细解释这些命令的用法和作用。 1. `BEGIN TRAN`: `BEGIN TRAN` 语句用于启动一个新的事务。当开始一个事务时,...
Sql Server2005/2008提供了begin tran、commit tran和rollback tran三个语句来显示地使用事务。begin tran表示事务开始,commit tran表示事务提交,rollback tran表示事务回滚。例如: ```sql begin try begin tran...
BEGIN TRAN UPDATE statement 1 ... UPDATE statement 2 ... DELETE statement 3 ... COMMIT TRAN ``` 2. **检查@@ERROR变量**:在每个DML(数据修改语言)语句后检查`@@ERROR`变量,如果非零则表示有错误发生。...
2. 手动提交模式:通过执行`BEGIN`或`START TRANSACTION`语句,或显式设置`SET autocommit=0`,可以进入手动提交模式,在这个模式下,需要程序员手动执行`COMMIT`或`ROLLBACK`来控制事务的提交或回滚。 在事务的...
SQL Server通过Begin Tran语句来控制同一个批次的Transaction中的多个SQL语句及其处理的数据,通过Commit Tran和Rollback Tran语句来保证它们被全部处理成功后才提交,或者当该组中的任一个或多个处理失败时被全部回...
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 中,解决死锁的...
- 使用`begin tran`和`commit/rollback tran`语句来控制事务的开始与结束。 - 通过`@@ERROR`系统变量来判断是否有错误发生,从而决定是否回滚事务。 - 最后通过`select`语句验证数据是否正确插入。 ##### 2. 修改...
tran = session.beginTransaction(); id = session.save(u); tran.commit(); }catch(Exception exp){ exp.printStackTrace(); tran.rollback(); }finally{ if(null != null) session.close(); } ...
通过使用`BEGIN TRAN`, `COMMIT TRAN`, `ROLLBACK TRAN`和`SAVE TRAN`,开发者可以精确控制数据库更新,防止因错误或异常导致的数据不一致。在实际开发中,合理使用事务有助于构建健壮、可靠的数据库应用程序。
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(); }
SQL事务是指在SQL Server中直接通过`BEGIN TRAN`, `ROLLBACK TRAN`, 和 `COMMIT TRAN`语句来控制事务。这种方式执行效率高,但其局限性在于事务上下文仅限于数据库内部,不适用于涉及多个数据库操作或复杂业务逻辑...
- **SQL语句控制**:可以直接在SQL语句中使用`BEGIN TRAN`, `COMMIT TRAN`, `ROLLBACK TRAN`来控制事务。例如,创建一个存储过程,其中包含开始事务、删除操作、检查错误、根据错误状态提交或回滚事务的逻辑。 在...
BEGIN TRAN UPDATE statement 1 ... UPDATE statement 2 ... DELETE statement 3 ... COMMIT TRAN ``` 如果`UPDATE statement 1`引发错误,整个事务将被回滚,不会执行后面的语句。 2. 在每个DML语句后检查`...
3. **事务管理**:通过`BEGIN TRAN`开始一个新的事务,在`COMMIT TRAN`中提交事务,在`ROLLBACK TRAN`中回滚事务。 **优点**: - **增强错误处理能力**:能够捕获并处理运行时错误,确保应用程序的稳定性和可靠性。...
- `BEGIN TRAN` 开始一个新的事务。 - `BEGIN TRY...BEGIN CATCH` 结构用于事务内的错误处理。 - `ROLLBACK TRAN` 在出现错误时回滚当前事务。 - `COMMIT TRAN` 提交当前事务。 ### 3. 日志备份与数据库收缩 **...
在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. 集群和复制技术:提供高可用性和灾难恢复解决方案。 通过深入理解和熟练掌握这些知识点,无论是开发应用...