描述事务
事务是一个或多个被视为单元的 T-SQL 语句。 如果单个事务失败,则所有语句都失败。 如果事务成功,则你知道事务中的所有数据修改语句都成功,并且已提交到数据库。
事务确保一个事务内的所有语句都成功或全部失败,不允许部分完成。 事务封装逻辑上必须一起进行的操作,例如在属于单个操作的相关表中输入多个条目。
考虑一个将购买存储在 Sales.Order 表中的业务,以及将付款存储在 Sales.Payment 表中的业务。 当有人购买物品时,必须更新这两个表。 如果在没有事务的情况下实现此操作,并且在将付款写入数据库时发生错误,那么仍会提交 Sales.Order 插入,但付款表没有条目。
当通过事务实现此操作时,要么同时创建两个条目,要么不创建任何条目。 如果向表中写入付款时出错,订单插入也会回滚。 这意味着数据库始终处于一致状态。
应指出,这是指严重错误,例如硬件或网络错误。 SQL 语句中的错误只会在某些情况下导致事务回滚,并且请务必查看本模块中的后续单元,以充分了解使用事务的影响。
不同类型的交易:
显式事务
关键字 BEGIN TRANSACTION 和 COMMIT 或 ROLLBACK 用于开始和结束每批语句。 你可以指定哪些语句必须被一起提交或回滚。
隐式事务
上一个事务完成后,一个事务就开始了。 每个事务都使用 COMMIT 或 ROLLBACK 语句显式完成。
ACID 特征
联机事务处理 (OLTP) 系统要求事务满足“ACID”特征:
- 原子性 - 每个事务都被视为一个完全成功或完全失败的单位。 例如,涉及从一个账户借记资金并将相同金额的资金贷记到另一个账户的事务必须完成这两项操作。 如果其中一个操作不能完成,那么另一个操作一定会失败。
- 一致性 - 事务只能将数据库中的数据从一个有效状态转换为另一个有效状态。 为了继续上面的借记和贷记示例,事务的完成状态必须反映资金从一个账户转移到另一个账户。
- 隔离 - 并发事务不能相互干扰,必须生成一致的数据库状态。 例如,虽然将资金从一个帐户转移到另一个帐户的事务正在进行中,但检查这些帐户的余额的另一个交易必须返回一致的结果 - 余额检查交易无法检索一个反映转移前余额的帐户的值,另一个帐户的值反映转移后的余额。
- 持久性 - 事务在完成提交后将保持“已提交”状态。 账户转账事务完成后,修改后的账户余额将持久保存,这样即使数据库系统被关闭,再次开启时也会反映已提交的事务。