使用事务安全地更改数据

无论何时更改数据,都可以在数据操作语言(DML)命令中将更改包装在事务中。DML 包括 UPDATETRUNCATEINSERTDELETE。你可以确保更改正确数据的方法之一是使用事务。

DML 更改将锁定受影响的行。当你开始事务时,你必须结束事务,否则 DML 中所有正在更改的对象将由开始事务的人保持锁定状态。你可以使用 ROLLBACKCOMMIT 结束事务。ROLLBACK 将事务中的所有内容返回到其原始状态。COMMIT 将数据置于最终状态,在没有其他 DML 语句的情况下,你无法撤消更改。

例:

--Create a test table

USE [your database]
GO
CREATE TABLE test_transaction (column_1 varchar(10))
GO

INSERT INTO 
 dbo.test_transaction
        ( column_1 )
VALUES
        ( 'a' )

BEGIN TRANSACTION --This is the beginning of your transaction

UPDATE dbo.test_transaction
SET column_1 = 'B'
OUTPUT INSERTED.*
WHERE column_1 = 'A'
  

ROLLBACK TRANSACTION  --Rollback will undo your changes
           --Alternatively, use COMMIT to save your results

SELECT * FROM dbo.test_transaction   --View the table after your changes have been run

DROP TABLE dbo.test_transaction

笔记:

  • 这是一个简化的示例,不包括错误处理。但任何数据库操作都可能失败,因此抛出异常。 下面是一个示例, 说明这种必需的错误处理方式。不应该在没有错误处理程序的情况下使用事务,否则可能会使事务处于未知状态。
  • 根据 隔离级别 ,事务会对要查询或更改的数据进行锁定。你需要确保事务长时间不运行,因为它们将锁定数据库中的记录,并可能导致与其他并行运行事务的 死锁 。保持封装在事务中的操作尽可能短,并最大限度地减少对锁定的数据量的影响。