并行事务引发的问题:

  • 脏读:如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。
  • 不可重复读:在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了不可 重复读现象。
  • 幻读:在一个事务内多次查询某个符合查询条件的记录数量,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了幻读现象。

四种事务隔离级别:

  1. 读未提交 (Read Uncommitted)
    • 定义:一个事务可以读取另一个事务未提交的数据。
    • 特点:此级别提供最低的隔离性,允许脏读,可能会读取到不一致的数据。
    • 问题:- 脏读 (Dirty Read):事务 A 读取事务 B 未提交的修改。如果事务 B 最后回滚,事务 A 读取的数据是无效的。
    • 适用场景:通常用于对数据一致性要求不高的场景,比如日志记录或某些分析任务。
  2. 读已提交 (Read Committed)
    • 定义:一个事务只能读取其他事务已提交的数据。
    • 特点:这种隔离级别解决了脏读问题,但仍然存在不可重复读的问题。事务 A 可以读取到事务 B 已提交的不同版本数据。
    • 问题:- 不可重复读 (Non-repeatable Read):事务 A 在读取数据后,事务 B 对该数据进行了修改并提交,导致事务 A 读取到不同的值。
    • 适用场景:适用于对脏读不敏感,但对不可重复读较为关心的场景。
  3. 可重复读 (Repeatable Read)
    • 定义:在一个事务中多次读取同一数据时,读取到的结果是相同的,即保证事务期间数据不会发生变化。
    • 特点:解决了脏读和不可重复读的问题,但是仍然可能出现幻读。
    • 问题:- 幻读 (Phantom Read):事务 A 查询符合条件的记录集合时,事务 B 插入、删除或更新了符合条件的数据,导致事务 A 再次查询时,返回的记录集合发生了变化。
    • 适用场景:适用于对数据一致性要求较高,但仍能接受在事务中出现幻读的场景。
  4. 串行化 (Serializable)
    • 定义:最高的隔离级别,事务按顺序执行,确保每次事务的读取和写入都不会与其他事务发生并发冲突。
    • 特点:完全避免脏读、不可重复读和幻读,通过加锁或其他机制确保事务完全串行化执行,牺牲了性能。
    • 问题:- 性能下降:为了保证事务的串行执行,数据库会加大锁的粒度,导致并发性能极大下降。
    • 适用场景:适用于对数据一致性要求极高,且并发量较低的场景。

各隔离级别对数据并发问题的影响:

隔离级别脏读(DirtyRead)不可重复读(Non-repeatableRead)幻读(PhantomRead)
读未提交允许允许允许
读已提交不允许允许允许
可重复读不允许不允许允许
串行化不允许不允许不允许

如何选择合适的事务隔离级别:

  • 性能与一致性的平衡:选择合适的事务隔离级别取决于应用对数据一致性和系统性能的要求。
    • 如果对性能要求很高,可以选择 读未提交 或 读已提交,但要注意可能存在脏读或不可重复读等问题。
    • 如果需要保证事务中的数据一致性(即不能有不可重复读),可以选择 可重复读。
    • 对于绝对一致性的需求(例如银行转账),应该选择 串行化,虽然会牺牲一定的性能。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐