5月26日数据库学习笔记
一、事务概述
事务(Transaction) 是数据库管理系统(DBMS)中用于保证数据一致性和完整性的基本操作单元。它是一系列的数据库操作,这些操作要么全部成功,要么全部失败,从而确保数据库状态的一致性。
(一)事务的特性(ACID)
原子性(Atomicity)
定义 :事务中的所有操作要么全部完成,要么全部不做。事务在执行过程中,如果任何一个操作失败,整个事务都会回滚到事务开始前的状态。
示例 :在银行转账操作中,从账户 A 转 100 元到账户 B,这个操作包括两个子操作:从账户 A 减去 100 元和向账户 B 加上 100 元。如果在执行过程中,第一个操作成功,但第二个操作失败,那么整个事务会回滚,账户 A 和账户 B 的金额都不会发生变化。
一致性(Consistency)
定义 :事务执行前后,数据库的完整性约束没有被破坏。事务必须使数据库从一个一致性状态转换到另一个一致性状态。
示例 :在一个库存管理系统中,如果商品数量不能为负数,那么任何减少商品数量的操作都必须确保操作后商品数量仍然大于等于 0。如果一个事务试图将商品数量减少到负数,那么这个事务会被拒绝,以保证数据库的一致性。
隔离性(Isolation)
定义 :多个事务并发执行时,一个事务的执行不应受到其他事务的干扰。每个事务在执行过程中,就好像它是数据库中唯一的事务一样。
示例 :假设两个事务同时对同一个账户进行操作,一个事务试图将账户余额增加 100 元,另一个事务试图将账户余额减少 50 元。如果这两个事务没有隔离性,可能会导致账户余额的计算错误。通过隔离性机制,可以确保每个事务在执行过程中不会受到其他事务的干扰。
持久性(Durability)
定义 :事务一旦提交,其对数据库的改变就是永久的,即使在系统故障的情况下也不会丢失。
示例 :在完成一个事务后,即使数据库服务器突然断电,事务所做的一切更改仍然会保存在数据库中,不会因为故障而丢失。
二、事务的隔离级别
(一)隔离级别概述
隔离级别决定了一个事务在并发环境中与其他事务隔离的程度。不同的隔离级别会带来不同的并发问题,如脏读、不可重复读和幻读。
(二)常见的隔离级别
READ UNCOMMITTED(读未提交)
定义 :最低的隔离级别,允许一个事务读取其他事务未提交的数据。在这种隔离级别下,可能会出现脏读、不可重复读和幻读问题。
示例 :事务 A 读取了事务 B 更新的数据,但事务 B 随后回滚,导致事务 A 读取的数据是无效的(脏读)。
READ COMMITTED(读已提交)
定义 :一个事务只能读取其他事务已经提交的数据,解决了脏读问题,但仍然可能出现不可重复读和幻读问题。
示例 :事务 A 读取了某个数据,然后事务 B 更新了这个数据并提交,当事务 A 再次读取这个数据时,发现数据已经改变(不可重复读)。
REPEATABLE READ(可重复读)
定义 :在同一个事务中,多次读取同一数据时,结果是一致的。这种隔离级别解决了不可重复读问题,但可能会出现幻读问题。
示例 :事务 A 读取了某个范围的数据,然后事务 B 在这个范围内插入了新的数据并提交,当事务 A 再次读取这个范围的数据时,发现多出了新的数据(幻读)。
SERIALIZABLE(可串行化)
定义 :最高的隔离级别,事务串行执行,完全避免了并发问题,包括脏读、不可重复读和幻读。但这种隔离级别会导致性能下降,因为事务需要等待其他事务完成才能执行。
示例 :事务 A 和事务 B 都试图对同一个数据进行操作,但在可串行化隔离级别下,它们会被强制串行执行,事务 A 完成后事务 B 才能开始。
三、事务的控制语句
(一)开始事务
在大多数数据库管理系统中,事务的开始是隐式的,当执行第一个 SQL 语句时,事务自动开始。但在某些情况下,也可以显式地开始一个事务。
(二)提交事务
当事务中的所有操作都成功完成时,可以提交事务,使事务中的更改永久生效。
SQL 语句 :COMMIT;
(三)回滚事务
如果事务中的任何一个操作失败,可以回滚事务,撤销事务中的所有更改,恢复到事务开始前的状态。
SQL 语句 :ROLLBACK;
(四)设置隔离级别
在事务开始之前,可以设置事务的隔离级别,以控制事务的并发行为。
SQL 语句 :SET SESSION TRANSACTION ISOLATION LEVEL [隔离级别];
示例 :SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
四、事务的并发问题
(一)脏读
定义 :一个事务读取了另一个事务未提交的数据。
解决方法 :设置隔离级别为 READ COMMITTED 或更高。
(二)不可重复读
定义 :在一个事务中,多次读取同一数据时,结果不一致,因为其他事务对数据进行了更新。
解决方法 :设置隔离级别为 REPEATABLE READ 或更高。
(三)幻读
定义 :在一个事务中,多次读取同一范围的数据时,结果不一致,因为其他事务在该范围内插入或删除了数据。
解决方法 :设置隔离级别为 SERIALIZABLE。
五、事务的最佳实践
(一)合理选择隔离级别
在大多数情况下,使用默认的隔离级别(如 REPEATABLE READ)即可满足需求。只有在特定的业务场景下,才需要调整隔离级别。例如,对于对数据一致性要求极高的场景,可以使用 SERIALIZABLE;而对于对性能要求较高的场景,可以使用 READ COMMITTED。
(二)尽量减少事务的范围
事务的范围越小,锁定的资源就越少,对并发性能的影响就越小。因此,在设计事务时,应尽量将事务的范围控制在最小的必要范围内,只包含必要的操作。
(三)避免长时间的事务
长时间的事务会占用数据库资源,影响系统的性能和并发能力。因此,应尽量避免长时间的事务,及时提交或回滚事务。
(四)使用事务日志
事务日志是数据库管理系统用于记录事务操作的重要工具。通过事务日志,可以实现事务的持久性和恢复。在实际应用中,应确保事务日志的完整性和可靠性,定期备份事务日志,以便在系统故障时进行数据恢复。
浙公网安备 33010602011771号