锁就是防止其他事务访问指定的资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。
一般来说,锁可以防止脏读、不可重复读和幻觉读。
1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。
ANSI SQL中定义的4个隔离级实际上是用对锁的操作来定义的:
Read Uncommitted(未提交读取,也叫脏读): 读数据时不加锁。允许脏读、不可重复读、幻觉读。
Read Committed(提交读取): 在读数据之前加一个读锁,读完之后释放锁。允许不可重复读、幻觉读。
Repeatable Read(可重复读取): 在读数据之前加一个读锁,读完之后不释放锁,直到事务rollback或者commit后才释放锁。允许幻觉读。
Serializable(串行化读取): 在读数据之前在读取的条件上加锁(称为条件锁),读完之后不释放锁,直到事务rollback或者commit后才释放锁。不允许脏读、不可重复读、幻读。
补充 : 基于元数据的 Spring 声明性事务 :
Isolation 属性一共支持五种事务设置,具体介绍如下:
l DEFAULT 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .
l READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
l READ_COMMITTED 会出现不可重复读、幻读问题(锁定正在读取的行)
l REPEATABLE_READ 会出幻读(锁定所读取的所有行)
l SERIALIZABLE 保证所有的情况不会发生(锁表)
不可重复读的重点是修改 :
同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件 , 第 1 次和第 2 次读出来的记录数不一样
分享到:
相关推荐
脏读、不可重复读和幻读都是在事务隔离性不足的情况下可能出现的问题。 1. **脏读**(Dirty Read): - **定义**:当一个事务正在访问数据,并对该数据进行了修改,但这种修改还没有提交到数据库中时,另一个事务...
2. 读提交(Read Committed):仅能读取已提交的数据,避免脏读,但仍可能遇到不可重复读和幻读。 3. 可重复读(Repeated Read):保证同一事务内的多次读取返回相同数据,防止不可重复读,但幻读仍可能发生,如...
- 可串行化(Serializable):最高的隔离级别,它通过强制事务串行执行,避免了脏读、不可重复读和幻读问题,但是对性能影响最大。 除了事务隔离机制,数据库还使用了MVCC(多版本并发控制)来处理并发事务。MVCC...
- 串行化(Serializable):最严格的隔离级别,通过锁定所有涉及的行,确保事务按顺序执行,避免脏读、不可重复读和幻读,但可能造成较高的并发性能损失。 在MySQL中,可以通过设置事务隔离级别或使用特定的查询...
数据库事务与隔离级别 数据库事务是指一系列操作的集合,作为一个单元执行,以维护数据库的一致性和...数据库提供了多种隔离级别以避免这些问题,例如Serializable(串行化)可以避免脏读、不可重复读、幻读的发生。
它通过控制不同事务对共享资源的访问,防止并发操作带来的数据冲突,如丢失更新、脏读、不可重复读和幻觉读等常见问题。 1. 丢失更新:当两个事务同时对同一数据行进行更新时,最后一个更新会覆盖掉第一个事务的...
- **Serializable**:这种隔离级别提供最强的隔离,它可以避免脏读、不可重复读和幻觉读。但是,由于更严格的锁控制,它可能会降低并发性能。 - **Read Only**:这个隔离级别不允许事务对数据进行任何修改,只允许...
不同的隔离级别决定了事务如何处理脏读、不可重复读和幻读等问题。 4. **脏读、不可重复读和幻读**: - 脏读:一个事务读到了另一个未提交事务的数据修改。 - 不可重复读:同一事务中,两次读取同一数据,结果不...
不可重复读可以通过可重复读(Repeatable Read)隔离级别解决,事务A在整个事务期间都能看到一致性视图,不受其他事务的影响。 4. **幻觉读**:事务A在读取数据后,事务B插入了新的行,导致事务A再次读取时看到“新...
* 未提交读(Read Uncommitted):脏读、不可重复读和虚读都有可能发生。 * 已提交读(Read Committed):避免脏读。但是不可重复读和虚读有可能发生。 * 可重复读(Repeatable Read):避免脏读和不可重复读。但是...
总结来说,数据库的四种隔离级别分别是读未提交、读已提交、可重复读和串行化,它们分别针对不同的并发问题:脏读、不可重复读和幻读。理解这些隔离级别及其相互关系,对于理解和优化数据库系统的并发行为至关重要。...
- **定义**:最高级别的隔离级别,确保所有 SQL 操作按顺序执行,彻底解决脏读、不可重复读及幻读等问题。 - **特点**:虽然能保证数据一致性,但性能较低。 ### 幻读 - **定义**:在同一事务下,连续执行相同的 ...
可重复读(REPEATABLEREAD):和 2 个 select 语句联系起来的,要求 2 个 select 返回同一个数据集,当两次读之间有记录插入时,会造成幻觉记录; 顺序读(SERIALIZABLE):最高的隔离级别。事务彼此隔离,等同于 ...
- 序列化(Serializable):最高隔离级别,防止脏读、不可重复读和幻读,但并发性能最低。 在SQL Server中,通过设置事务的隔离级别,可以控制这些并发问题的程度。正确理解和使用事务和锁对于开发高效且可靠的...
MySQL默认的事务隔离级别为`Repeatable Read`,这一级别可以避免脏读和不可重复读,但需要注意的是,即使在这一级别下也可能发生幻读。为了防止幻读,MySQL使用了Next-Key Locks机制。 #### 存储引擎 **3. MySQL...
它定义了事务如何避免脏读、不可重复读和幻像读等问题。 1. 脏读(Dirty Reads):一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前...
并发控制的主要目标是防止多个事务在执行过程中产生冲突,例如丢失更新、脏读、不可重复读和幻读等问题。以下是一些关键知识点: 1. **事务**: 事务是数据库操作的基本单位,具有原子性、一致性、隔离性和持久性...
它基于事务的ACID(原子性、一致性、隔离性、持久性)特性中的隔离性,旨在防止脏读、不可重复读和幻读等问题的发生。让我们逐一解析这些概念: 1. **脏读**:当一个事务读取了另一个未提交事务修改的数据,如果这...