【数据库】— ACID、脏读、不可重复读和幻读、数据库锁、意向锁、数据库隔离级别

ACID

ACID 是指数据库事务的四个关键属性,这些属性确保了在数据库事务中数据的一致性和可靠性。ACID 是:

  1. 原子性(Atomicity):一个事务被视为一个不可分割的最小工作单元,事务中的所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。如果事务中的任何一项操作失败,则整个事务将会回滚,以确保数据的一致性。

  2. 一致性(Consistency):事务开始和结束时,数据库必须处于一致的状态。这意味着事务执行的任何更改必须满足数据库的约束条件和规则,以确保数据的完整性和正确性。

  3. 隔离性(Isolation):多个事务同时进行时,每个事务应该被隔离开来,以防止互相干扰。每个事务应该看起来像是在单独地执行,即使多个事务同时执行也不应该影响数据的一致性和正确性。

  4. 持久性(Durability):一旦事务提交,其结果应该是永久性的,即使发生系统故障或其他异常情况,数据也不应该丢失。

这些属性确保了数据库事务的可靠性和一致性,从而保证了数据的完整性和正确性。ACID 是数据库事务设计和实现的重要原则,也是数据库系统中的核心概念。

下面是一个表格,说明脏读、不可重复读和幻读的区别:

脏读 不可重复读 幻读
定义 一个事务读取了另一个事务未提交的数据。 一个事务多次读取同一数据,但是在读取过程中,数据被另一个事务修改了。 一个事务多次读取同一范围的数据,但是在读取过程中,数据被另一个事务插入或删除了。
示例 事务A读取了事务B未提交的数据。 事务A先读取了一行数据,然后事务B修改了这行数据,最后事务A又读取了同一行数据。 事务A先读取了一段范围的数据,然后事务B插入了一行数据,最后事务A又读取了同一范围的数据。
导致原因 读取未提交的数据。 读取了被其他事务修改的数据。 读取了被其他事务插入或删除的数据。
锁类型 读未提交(Read Uncommitted) 读已提交(Read Committed) 可重复读(Repeatable Read)
解决方法 采用锁机制或隔离级别来避免。 采用锁机制或隔离级别来避免。 采用锁机制或隔离级别来避免。

意向锁(Intention Lock)

意向锁(Intention Lock)是一种数据库锁机制,用于协调多个并发事务对同一资源的访问。在使用意向锁时,事务会先获取一个意向锁,然后再获取资源级别的锁。意向锁的作用是告诉其他事务,当前事务已经有意向获取资源级别的锁,从而避免其他事务在此期间获取相同的资源级别锁,导致死锁。

在意向锁机制中,有两种意向锁,分别是意向共享锁(Intent Share Lock,简称IS锁)和意向排它锁(Intent Exclusive Lock,简称IX锁)。当一个事务要获取一个资源级别的共享锁或排它锁时,它会先获取一个对应的意向锁。例如,当一个事务要获取一个表的共享锁时,它会先获取一个IS锁,表示它有意向获取一个共享锁。如果另一个事务要获取相同的资源级别锁,它会检查是否存在意向锁。如果存在对应的意向锁,那么它可以继续等待获取锁的机会,否则它需要先获取一个对应的意向锁。

使用意向锁机制可以减少锁冲突的概率,提高并发性能。然而,如果使用不当,意向锁也可能导致性能问题。因此,在实际应用中,需要根据具体的业务场景和数据库系统的特点来选择合适的锁机制。

下面是一个表格,整理了常见的数据库锁和它们的特点:

锁类型 定义 加锁方式 锁特点 解锁方式 示例 适用场景 注意事项
X锁 排他锁,也称写锁,用于防止其他事务对数据进行修改。 当一个事务要对某个数据进行修改时,会先获取一个X锁,然后再进行修改操作。 1. 独占性:当一个事务持有X锁时,其他事务不能同时持有X锁或S锁。 2. 阻塞性:当一个事务请求获取X锁时,如果该锁已经被其他事务持有,则该事务会被阻塞,直到该锁被释放。 当一个事务完成对数据的修改操作时,会释放它持有的X锁。 事务A获取了一行数据的X锁,然后对该行数据进行修改操作。此时,其他事务无法同时获取该行数据的X锁或S锁,直到事务A释放了X锁。 当一个事务要对数据进行修改时,需要先获取X锁来保证独占性,避免其他事务同时对数据进行修改。 必须谨慎使用X锁,避免死锁和性能问题。在高并发场景下,应尽量减少X锁的持有时间,避免其他事务被阻塞。
S锁 共享锁,也称读锁,用于允许多个事务同时读取同一份数据。 当一个事务要读取某个数据时,会先获取一个S锁,其他事务也可以同时获取同一份数据的S锁。 1. 共享性:多个事务可以同时持有S锁。 2. 非阻塞性:当一个事务请求获取S锁时,如果该锁已经被其他事务持有,则该事务可以继续执行,不会被阻塞。 当一个事务完成对数据的读取操作时,会释放它持有的S锁。 事务A获取了一行数据的S锁,然后对该行数据进行读取操作。此时,其他事务也可以同时获取该行数据的S锁,以读取该行数据。 当一个事务只需要读取数据而不需要进行修改时,可以获取S锁,以允许多个事务同时读取同一份数据,提高并发性能。 S锁不会阻塞其他事务的读操作,但是会阻塞其他事务的写操作。
IS锁 意向共享锁,是一种辅助锁,用于表示一个事务要获取共享锁。 当一个事务要获取S锁时,会先获取该数据表的IS锁。 1. 辅助性:IS锁不会直接影响数据的读取或修改,只是表示一个事务要获取共享锁。 2. 层次性:IS锁是一种表级锁,表示一个事务要获取表的共享锁。 当一个事务完成对数据的读取操作时,会释放它持有的S锁和IS锁。 事务A要获取某个数据表的S锁,会先获取该表的IS锁,表示它要获取表级共享锁。 当一个事务要对某个数据表进行读取操作时,需要先获取IS锁,以表示它要获取共享锁。 不需要单独使用IS锁,它通常是由数据库系统自动获取和释放的,用于协调不同事务之间的锁冲突。
IX锁 意向排他锁,是一种辅助锁,用于表示一个事务要获取排他锁。 当一个事务要获取X锁时,会先获取该数据表的IX锁。 1. 辅助性:IX锁不会直接影响数据的读取或修改,只是表示一个事务要获取排他锁。 2. 层次性:IX锁是一种表级锁,表示一个事务要获取表的排他锁。 当一个事务完成对数据的修改操作时,会释放它持有的X锁和IX锁。 事务A要获取某个数据表的X锁,会先获取该表的IX锁,表示它要获取表级排他锁。 当一个事务要对某个数据表进行修改操作时,需要先获取IX锁,以表示它要获取排他锁。 不需要单独使用IX锁,它通常是由数据库系统自动获取和释放的,用于协调不同事务之间的锁冲突。
U锁 更新锁,也称幻读锁,是一种介于S锁和X锁之间的锁,用于防止幻读现象。 当一个事务要对某个数据进行修改时,会先获取一个U锁,其他事务可以同时获取S锁,但不能获取X锁。 1. 防止幻读:U锁可以防止其他事务在同一时间插入或删除与当前事务相同的数据,避免出现幻读现象。 2. 非阻塞性:当一个事务请求获取U锁时,如果该锁已经被其他事务持有,则该事务可以继续执行,不会被阻塞。 当一个事务完成对数据的修改操作时,会释放它持有的U锁。 事务A获取了一行数据的U锁,然后对该行数据进行修改操作。此时,其他事务可以同时获取该行数据的S锁,但不能获取X锁。 当一个事务要对数据进行修改时,需要先获取U锁来防止出现幻读现象,同时避免阻塞其他事务的读操作。 U锁的使用需要谨慎,过多的U锁会影响性能。在实际应用中,需要根据具体的业务场景和数据库系统的特点来选择合适的锁机制。
行级锁 行级锁是一种细粒度的锁,用于保护单个数据行的并发访问。 当一个事务要对某个数据行进行读取或修改时,会先获取该行数据的行级锁。 1. 细粒度:行级锁只针对单个数据行,避免其他事务对整个数据表的操作。 2. 精确性:行级锁可以精确控制对数据行的并发访问,提高并发性能。 当一个事务完成对数据的读取或修改操作时,会释放它持有的行级锁。 事务A获取了某个数据行的行级锁,然后对该行数据进行读取或修改操作。此时,其他事务需要等待该锁释放后才能进行读取或修改操作。 当一个事务需要对单个数据行进行并发访问时,可以采用行级锁来保证数据的一致性和并发性能。 行级锁的使用需要谨慎,过多的行级锁会影响性

下面是一个表格,说明常见的数据库隔离级别和它们的特点:

隔离级别 定义 并发问题 锁定粒度 读取一致性 示例 适用场景 注意事项
读未提交 最低的隔离级别,允许一个事务读取另一个事务未提交的数据。 脏读、不可重复读、幻读 行级锁 读取未提交数据,不保证数据的一致性。 事务A读取了事务B未提交的数据,导致出现脏读现象。 适用于并发性要求不高的场景,或者对数据一致性要求比较低的场景。 尽量避免使用该隔离级别,可能会导致数据不一致。
读已提交 允许一个事务只能读取另一个事务已经提交的数据。 不可重复读、幻读 行级锁 读取已提交数据,保证读取的数据是最新的提交数据。 事务A读取了事务B已经提交的数据,不会出现脏读现象。 适用于大多数的业务场景,对数据一致性要求较高的场景。 该隔离级别下,事务A只能读取到已经提交的数据,但是在事务A读取数据的过程中,事务B可能已经对数据进行了修改并提交,导致事务A读取到不一致的数据,出现不可重复读和幻读现象。
可重复读 保证同一个事务多次读取同一数据时,能够读取到相同的数据。 幻读 行级锁 读取可重复数据,保证读取的数据是一致的。 事务A读取数据后,事务B对该数据进行了修改并提交,但是事务A仍然能够读取到原来的数据,不会出现不可重复读现象。 适用于对数据一致性要求比较高的业务场景。 该隔离级别下,事务A在读取数据的过程中,其他事务不能对该数据进行修改和删除,但是可以插入新的数据,导致出现幻读现象。
序列化 最高的隔离级别,保证事务串行执行,完全避免并发问题。 表级锁 读取一致性最高,保证事务之间没有并发问题。 事务A和事务B不能同时对同一张表进行操作,完全避免并发问题。 适用于对数据一致性要求非常高的业务场景,例如金融系统等。 该隔离级别下,事务串行执行,会降低系统的并发性能。

隔离级别越高,数据的一致性越好,但是对系统的性能和并发性能会有一定的影响。在实际应用中,需要根据具体的业务场景和数据库系统的特点来选择合适的隔离级别。同时,需要注意避免死锁和性能问题,合理使用锁机制和事务处理技术。

猜你喜欢

转载自blog.csdn.net/weixin_56462041/article/details/131067886