📜  SQL |交易(1)

📅  最后修改于: 2023-12-03 15:05:18.126000             🧑  作者: Mango

SQL 交易

在关系型数据库中,交易是一组相关的数据库操作,这些操作要么全部完成并成功提交,要么全部取消并回滚。在 SQL 中,使用 COMMITROLLBACK 语句来提交或回滚交易。通常,交易用于确保数据一致性和完整性,减小数据损坏或误操作的风险。

事务的 ACID 特性

在 SQL 中,所谓的事务通常需要满足 ACID 特性:

  • 原子性(Atomicity):一个事务要么全部成功,要么全部回滚,不会出现部分操作成功。

  • 一致性(Consistency):事务执行前后,数据库必须保持一个一致状态,即满足所有约束条件。

  • 隔离性(Isolation):多个事务并发执行时,每个事务只能访问其他事务提交之前的状态,避免交叉影响。

  • 持久性(Durability):一旦事务提交,其产生的影响将永久保存在数据库中。

交易的语法

在 SQL 中,交易通常使用如下语法:

BEGIN TRANSACTION;
-- 对数据库进行一系列操作
COMMIT;

如果要取消交易,可以使用回滚操作:

BEGIN TRANSACTION;
-- 对数据库进行一系列操作
ROLLBACK;
交易的示例

以下是一组简单的交易示例,其中使用 accounts 表表示银行帐户,用于演示在同时进行的多个交易中如何保持一致性。

假设有以下数据表 accounts

CREATE TABLE accounts (
  id INT PRIMARY KEY,
  balance DECIMAL(10,2)
);

INSERT INTO accounts (id, balance) VALUES (1, 100.00);
INSERT INTO accounts (id, balance) VALUES (2, 0.00);
示例 1:成功的交易

在这个示例中,我们将进行一系列操作,将 50 美元从帐户 1 转移到帐户 2 中:

BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 50.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 50.00 WHERE id = 2;

COMMIT;
示例 2:取消的交易

在这个示例中,我们将在帐户 1 和帐户 2 之间尝试转移 200 美元。由于帐户 1 的余额不足,因此转移失败:

BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 200.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 200.00 WHERE id = 2;

ROLLBACK;

在此示例中,ROLLBACK 语句将回滚之前的更改,因此不会对数据库中的数据产生任何影响。

总结

SQL 中的交易是保证数据库一致性的重要手段。具备 ACID 特性的交易可以保证数据的正确性和完整性,避免了数据损坏或误操作的风险。通过使用 BEGIN TRANSACTION、COMMIT 和 ROLLBACK 等语句,我们可以轻松地执行和管理交易和回滚操作,从而始终保持数据的准确性和完整性。