数据库基础——事务
一、数据库事务的概念
-
定义
-
数据库事务是数据库管理系统的执行单元。它是由一系列操作组成,这些操作要么全部完成,要么全部不完成。事务是一个不可分割的工作单位。例如,在银行转账业务中,从账户 A 转出 100 元到账户 B 这个过程就是一个事务。它包括两个关键操作:从 A 账户中扣除 100 元(如果 A 账户余额足够)和向 B 账户存入 100 元。这两个操作必须同时成功或者同时失败,否则就会导致数据不一致。
-
-
目的
-
事务的主要目的是确保数据的完整性和一致性。在多用户并发访问数据库的情况下,事务可以防止多个事务对数据的相互干扰,保证每个事务的执行是独立的,并且能够正确地处理数据更新、插入和删除等操作。
-
二、事务的 ACID 特性
-
原子性(Atomicity)
-
原子性是指事务中的所有操作要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。例如,在一个电商系统的订单处理事务中,当创建订单、扣除库存和更新用户余额这三个操作中的任何一个出现错误,如库存不足导致更新库存失败,那么整个事务就会回滚,订单不会创建,用户余额也不会发生变化。
-
-
一致性(Consistency)
-
一致性要求事务必须使数据库从一个一致性状态转变到另一个一致性状态。也就是说,事务的执行不能破坏数据库的完整性约束。例如,数据库中有一个规则要求用户的余额不能为负数。在一个转账事务中,如果从账户 A 转出超出其余额的金额,这个事务就违反了一致性,数据库系统会阻止这样的事务执行,从而保持数据的一致性。
-
-
隔离性(Isolation)
-
隔离性是指一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发其他的事务是隔离的,并发执行的各个事务之间不能互相干扰。例如,当用户 A 正在查询数据库中某张表的数据时,用户 B 对这张表进行更新操作,隔离性可以确保用户 A 查到的数据是事务开始前的完整数据,而不是被用户 B 更新后的中间状态数据。
-
数据库系统提供了不同的隔离级别来满足不同的应用需求。主要有以下几种隔离级别:
-
读未提交(Read Uncommitted) :这是最低的隔离级别,允许一个事务读取其他事务尚未提交的数据。这种级别下很容易出现脏读(Dirty Read)问题。脏读是指一个事务读取了另一个事务未提交的更新数据,如果该事务回滚,那么读取到的数据就是不正确的。
-
读已提交(Read Committed) :一个事务只能读取其他事务已经提交的数据。它可以避免脏读现象,但在这种隔离级别下可能会出现不可重复读(Non - Repeatable Read)。不可重复读是指在一个事务内,多次读取同一数据得到的结果不同。例如,事务 A 先读取某行数据,然后事务 B 修改了该行数据并提交,事务 A 再次读取该行数据时就会得到不同的结果。
-
可重复读(Repeatable Read) :在同一个事务内,多次读取同一数据时,返回的结果是一致的。它可以避免不可重复读问题,但可能会出现幻读(Phantom Read)。幻读是指在一个事务内,两次查询结果的行数不同。比如,事务 A 先查询某表中满足条件的行数,事务 B 在这个表中插入满足该条件的新行并提交,事务 A 再次查询时就会发现行数增加了。
-
串行化(Serializable) :这是最高的隔离级别,它要求所有事务按顺序依次执行,避免了脏读、不可重复读和幻读问题。但这种级别下的并发性能会受到很大影响,因为事务之间需要相互等待。
-
-
持久性(Durability)
-
持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。即使系统出现故障,如断电、服务器崩溃等,数据库也应该能够利用日志等恢复机制保证事务操作的结果不会丢失。例如,当银行转账事务提交后,即使银行的计算机系统突然断电,转账后的账户余额更新也应该能够保存下来,不能因为系统故障而恢复到转账之前的状态。
-
三、事务的控制命令
-
开始事务命令
-
在 SQL 中,可以使用 “BEGIN TRANSACTION” 或 “START TRANSACTION” 来显式地开始一个事务。例如:
-
START TRANSACTION;
-
-
提交事务命令
-
使用 “COMMIT” 命令来提交事务。一旦提交,事务中的所有操作就会被永久地保存到数据库中。例如:
-
COMMIT;
-
-
回滚事务命令
-
如果事务执行过程中出现问题,可以使用 “ROLLBACK” 命令来撤销事务中尚未提交的操作,使数据库回到事务开始前的状态。例如:
-
ROLLBACK;
-
四、事务的应用场景
-
金融系统
-
如银行的转账、支付等操作。确保资金在不同账户之间的安全转移,同时避免数据不一致的情况。例如,在跨行转账过程中,涉及多个银行系统和多个账户的更新操作,事务可以保证这些复杂的操作要么全部完成,要么全部不完成,从而维护金融数据的准确性。
-
-
电商系统
-
在订单处理过程中,包括库存扣减、订单创建、用户余额更新等多个操作。事务可以确保这些操作的完整性和一致性,避免出现库存扣减了但订单没有成功创建或者用户余额被错误扣除等情况。
-
-
库存管理系统
-
当进行入库、出库操作时,事务可以保证库存数据的准确性。例如,在记录一批货物的入库操作时,涉及库存数量的更新、入库单的生成等多个步骤,事务可以确保这些操作全部正确完成,否则就会回滚,避免库存数据混乱。
-