sql server事务的使用是为了确保数据的一致性。
BEGIN TRANSACTION
- 标记一个显式本地事务的起始点。 显式事务以 BEGIN TRANSACTION 语句开始,并以 COMMIT 或 ROLLBACK 语句结束。
- BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。
- BEGIN TRANSACTION 代表一点,由连接引用的数据在该点逻辑和物理上都一致的。 如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。
- 每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。
COMMIT TRANSACTION
标志一个成功的隐性事务或显式事务的结束。 如果 @ @TRANCOUNT 为1,则 COMMIT TRANSACTION 使得自从事务开始后进行的所有数据修改成为数据库的部分,释放事务的资源,并将 @ @TRANCOUNT 减为0。 如果 @ @TRANCOUNT 大于1,则 COMMIT TRANSACTION 会将 @ @TRANCOUNT 减为1,并且事务将保持活动状态。
ROLLBACK TRANSACTION
将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。 可以使用 ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。 它还释放由事务控制的资源。
这不包括对局部变量或表变量所做的更改。 该语句不会清除这些更改。
- ROLLBACK TRANSACTION 语句不生成显示给用户的消息。 如果在存储过程或触发器中需要警告,请使用 RAISERROR 或 PRINT 语句。 RAISERROR 是用于指出错误的语句。
- 不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 将回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到外面的 BEGIN TRANSACTION 语句。 在这两种情况下,ROLLBACK TRANSACTION 都将 @@TRANCOUNT 系统函数减小为 0。 ROLLBACK TRANSACTIONsavepoint_name不会减小 @@TRANCOUNT。
- 在事务内允许有重复的保存点名称,但如果 ROLLBACK TRANSACTION 使用重复的保存点名称,则只回滚到近的使用该保存点名称的 SAVE TRANSACTION。
@@TRANCOUN
BEGIN TRANSACTION 语句将 @@TRANCOUNT 增加 1。 ROLLBACK TRANSACTION @@TRANCOUNT为 0,但 ROLLBACK TRANSACTIONsavepoint_name,这不会影响@@TRANCOUNT。 COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。
A. 使用显式事务
下面写法存在隐患,当操作(增删改)是由null引发的错误时,事务会跳过错误继续执行正常的语句
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. 回滚事务
CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
ROLLBACK;
C. 命名事务
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2012;
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
D. 标记事务
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2012;
GO
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO
E. 异常处理 begin try...end try...begin catch...end catch
begin tran
begin try
--sql语句1
--sql语句2
--sql语句3
end try
begin catch
if @@trancount>
rollback tran
end catch
if @@trancount>
commit tran
引用: