在数据库管理中,事务(Transaction)是一组操作的集合,这些操作要么全部成功,要么全部失败。事务确保了数据的完整性和一致性,即使在并发操作或系统故障的情况下也能做到这一点。
一、事务的四个特性(ACID)
事务通常遵循 **ACID** 原则,确保事务的可靠性:
1. 原子性(Atomicity)
事务中的所有操作被视为一个单一的操作单位,要么全部成功,要么全部失败。如果其中任何一个操作失败,整个事务将回滚,之前的所有操作都将恢复到事务开始之前的状态。
2. 一致性(Consistency)
事务必须使数据库从一种一致状态转换到另一种一致状态。事务开始前和结束后的数据都必须符合所有定义的约束、规则和关系。
3. 隔离性(Isolation)
事务的执行不应受到其他事务的影响。并发执行的事务应该是独立的,因此即使多个事务同时执行,每个事务的结果应该是可预测的。数据库通常使用隔离级别来管理事务的并发执行。
4. 持久性(Durability)
一旦事务提交,其结果是永久的,即使系统崩溃或发生故障,数据库的状态也应该保持在事务提交时的状态。持久性保证了已经提交的事务对数据库的修改是永久存储的。
二、事务的控制
在 SQL 中,可以使用以下语句来控制事务:
1. BEGIN TRANSACTION / START TRANSACTION
开始一个新事务。
START TRANSACTION;
2. COMMIT
提交事务,保存所有在事务中的更改。
COMMIT;
3. ROLLBACK
回滚事务,撤销在事务中所做的所有更改。
ROLLBACK;
三、示例
下面是一个使用 MySQL 的事务的简单示例,演示如何处理银行转账操作。模拟从一个账户转账到另一个账户:
create table accounts
(
id INT primary key,
balance DECIMAL(10, 2)
);
-- 假设账户 A 和账户 B
insert into
accounts (id, balance)
values
(1, 1000.00),
(2, 500.00);
-- 启动事务
start transaction;
-- 从账户 A 中扣款
update accounts
set
balance = balance - 200.00
where
id = 1;
-- 向账户 B 存款
update accounts
set
balance = balance + 200.00
where
id = 2;
-- 提交事务
commit;
如果在转账过程中的任一步骤发生错误(例如,账户 A 的余额不足),可以使用 `ROLLBACK` 来撤销已经执行的操作:
四、事务的隔离级别
不同的事务隔离级别会影响并发操作的行为:
1. 读未提交(READ UNCOMMITTED)
允许事务读取其他事务未提交的数据,可能导致脏读(Dirty Reads)。
2. 读已提交(READ COMMITTED)
事务只能读取已提交的数据,防止脏读,但可能会发生不可重复读(Non-repeatable Reads)。
3. 可重复读(REPEATABLE READ)
事务在执行期间能够多次读取同一数据行,每次返回相同结果,防止脏读和不可重复读,但可能导致幻读(Phantom Reads)。
4. 序列化(SERIALIZABLE)
强制事务顺序执行,完全避免并发问题,但性能最低。
五、总结
事务是确保数据库一致性的关键机制,通过支持事务的 ACID 特性和适当的控制语句,可以有效处理数据的批量更新、并发操作及错误回滚等情况。