1 事务的隔离级别
事务的隔离级别是数据库管理系统(DBMS)提供的一种机制,用于控制并发事务之间的相互影响程度。隔离级别决定了一个事务对于其他事务所做的修改是否可见,以及在多个事务并发执行时可能出现的各种问题的程度。
常见的事务隔离级别包括:
1. 读未提交(Read Uncommitted):允许一个事务读取其他事务尚未提交的数据,可能导致脏读、不可重复读和幻读等问题。
2. 读已提交(Read Committed):一个事务只能读取其他事务已经提交的数据,可以避免脏读,但仍可能出现不可重复读和幻读的问题。
3. 可重复读(Repeatable Read):保证在同一个事务中多次读取同一行数据时,所读取到的数据保持一致,可以避免脏读和不可重复读,但仍可能出现幻读的问题。
4. 串行化(Serializable):最高级别的隔离级别,确保事务串行执行,避免了所有并发问题,但可能会降低数据库的并发性能。
选择合适的隔离级别取决于应用程序的要求和业务场景的特点。较低的隔离级别通常可以提高数据库的并发性能,但可能会导致更多的并发问题;而较高的隔离级别可以提供更高的数据一致性和可靠性,但可能会降低数据库的并发性能。因此,在选择隔离级别时需要权衡考虑。
2 脏读 不可重复读 幻读
脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)是并发事务中常见的三种问题,它们反映了在不同隔离级别下事务之间可能出现的数据不一致性情况。
1. 脏读(Dirty Read):
- 脏读指的是一个事务读取到了另一个事务尚未提交的数据。如果这个事务后来回滚了,那么读取到的数据就是无效的。
- 例如,事务 A 修改了某行数据,但尚未提交,此时事务 B 读取到了这个未提交的数据,并基于这个数据做出了一些操作。如果事务 A 后来回滚了,那么事务 B 所读取到的数据就是脏数据,因为这个数据实际上是无效的。
2. 不可重复读(Non-Repeatable Read):
- 不可重复读指的是在同一个事务中,对同一行数据进行了多次读取,但在不同时间点读取到的数据不一致。
- 例如,事务 A 在一个事务中多次读取同一行数据,但在第二次读取时,发现数据已经被另一个事务修改了,导致读取到的数据不一致。
3. 幻读(Phantom Read):
- 幻读指的是在同一个事务中,对同一范围的数据进行了多次查询,但在不同时间点查询到的数据数量不一致。
- 例如,事务 A 在一个事务中查询某个范围内的数据,但在第二次查询时发现数据的数量发生了变化,可能是因为另一个事务插入了新的数据或者删除了部分数据。