1、什么是事务?
事务是指一个或多个数据库操作组成的逻辑工作单元,这些操作要么全做,要么全不做,是一种确保数据完整性与一致性的机制。在 SQL Server 中,事务是一个不可分割的操作序列,要么全部成功提交,要么全部失败回滚。
在事务中可能出现的问题有:
并发访问冲突,可能会导致脏读、不可重复读、幻读等问题;
异常中断后未提交的事务,可能会导致操作不完整。
出于上述问题的考虑,我们需要使用 SQL Server 的事务功能。
2、SQL Server 事务的特点
2.1 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单元,要么全部执行,要么全部不执行。如果其中任何一条命令执行失败,整个事务都将会回滚(Rollback)。
BEGIN TRANSACTION; --开始事务
--INSERT, UPDATE, SELECT, DELETE 操作
COMMIT TRANSACTION; --提交事务
2.2 一致性(Consistency)
一致性是指事务执行前后数据库必须处于一致状态。在SQL Server中,一致性是由约束(Constraints)、默认值(Default Values)、触发器(Triggers)等配置项保证的。
2.3 隔离性(Isolation)
隔离性是指一个事务的执行不应该受其他事务的干扰,在 SQL Server 中,事务的隔离级别可以设置,包括未提交读取(Read Uncommitted)、已提交读取(Read Committed)、可重复读取(Repeatable Read)和序列化(Serialization)四种级别。不同的隔离级别,会对并发访问产生不同的问题。
2.4 持久性(Durability)
持久性是指事务提交后,数据库变更会持久保存。即使发生宕机等故障,恢复后也能保证数据的一致性。
3、SQL Server 事务的提交与回滚
在 SQL Server 中,事务的提交和回滚是通过 COMMIT 和 ROLLBACK 语句实现的。在事务完成后,必须显式地提交或回滚事务,并且一旦提交或回滚就不能撤销。
3.1 事务的提交
提交(Commit)语句会使事务中的所有操作生效,并且释放所有锁定的资源。
BEGIN TRANSACTION;
--INSERT, UPDATE, SELECT, DELETE 操作
COMMIT TRANSACTION;
3.2 事务的回滚
回滚(Rollback)会使事务中的操作全部撤销,并且回滚到事务开始前的状态。
BEGIN TRANSACTION;
--INSERT, UPDATE, SELECT, DELETE 操作
ROLLBACK TRANSACTION;
3.3 事务的保存点
保存点(Savepoint)是指在事务中创建的中间提交点,在该点之前的操作可以被提交,而在该点之后的操作可以被回滚。
BEGIN TRANSACTION;
--INSERT, UPDATE, SELECT, DELETE 操作
SAVE TRANSACTION save_point1; --创建一个保存点
--INSERT, UPDATE, SELECT, DELETE 操作
ROLLBACK TRANSACTION save_point1; --回滚至保存点
COMMIT TRANSACTION;
4、SQL Server 事务的实例
下面是一个简单的实例,我们以一个银行账户转账的例子来演示事务的使用。
--定义 Bank_Account 表
CREATE TABLE Bank_Account
(
Account_ID INT PRIMARY KEY,
Balance DECIMAL(10, 2)
);
--插入测试数据
INSERT INTO Bank_Account VALUES (10000, 1000), (20000, 500);
--转账操作,从账户 10000 中转出 500 元至账户 20000 中
BEGIN TRANSACTION; --开始事务
UPDATE Bank_Account SET Balance = Balance - 500 WHERE Account_ID = 10000;
UPDATE Bank_Account SET Balance = Balance + 500 WHERE Account_ID = 20000;
COMMIT TRANSACTION; --提交事务
参考文献:
《SQL Server 事务处理 》
《SQL Server 事务》