2PL-事务并发控制

数据库的隔离级别

隔离级别 脏读(Dirty Read) 不可重复读(Non-Repeatable Read) 幻读(Phantom Read) 说明
读未提交(Read Uncommitted) ✅ 可能发生 ✅ 可能发生 ✅ 可能发生 最低隔离级别,事务可以读取未提交的数据,性能最高,但数据一致性最差。
读已提交(Read Committed) ❌ 不可能发生 ✅ 可能发生 ✅ 可能发生 保证只能读取已提交的数据,避免脏读,但同一事务中多次读取可能结果不同。
可重复读(Repeatable Read) ❌ 不可能发生 ❌ 不可能发生 ⚠️ 在某些数据库中可能发生(如MySQL InnoDB通过MVCC避免) 保证在事务内多次读取结果一致,MySQL InnoDB 默认级别。
序列化(Serializable) ❌ 不可能发生 ❌ 不可能发生 ❌ 不可能发生 最高隔离级别,事务串行执行,避免所有并发问题,但性能最低,容易出现锁竞争。
  • 脏读是说有个事务再改数据的途中,但是事务还没提交的数据被别的事务读取了。
  • 不可重复读是说当前一个数据第一次读取了数据,途中这个数据被另一个事务修改了,第二次在读取这个数据数据内容发生了改变。
  • 幻读是说第一次sql读取了2条数据,这时候另一个事务又提交了一个数据(可以是删除或者是新增),第二次读取了2条或者1条数据。

简单介绍下2PL(Two-phase locking)

2pl是一个两阶段锁定协议,目的确保并发执行时候的数据一致性。

  • 加锁阶段(Growing Phase): 事务可以请求并获取锁(如共享锁或排他锁)。 一旦事务释放了任何一个锁,就不能再请求新的锁。
  • 解锁阶段(Shrinking Phase): 事务只能释放锁,不能再请求新的锁。 所有锁释放后,事务结束。

简单的说下疑惑:锁先可以理解为读写锁进行加锁处理;但是这里就有个问题读写锁并不能限制多个冲突操作的执行顺序啊?

  • 这里请注意规定的加和解锁两个阶段的规定要么一直加,要么就是一直释放的。

2PL解决的哪些问题

  • 通过严格的锁管理,避免了脏读、不可重复读和幻读等问题
  • 如果多个事务互相等待对方释放锁,可能会导致死锁。
  • 加锁和解锁操作会增加系统的开销,尤其是在高并发场景中。(MVCC(Multi-Version Concurrency Control,多版本并发控制是一种用于数据库管理系统中处理事务并发的机制。它允许在并发环境下进行非锁定读取,从而提高系统的性能和并发能力。)

可以让AI生成一个简单的2PL demo,但是需要注意可能里面没有一直加锁的处理

相关推荐
l1t8 小时前
DeepSeek总结的 pg_regresql插件:真正可移植的 PostgreSQL 统计信息
数据库·postgresql
oradh8 小时前
Oracle 11.2.0.1版本升级至11.2.0.4_单机环境
数据库·oracle·oracle11g·oracle升级
l1t8 小时前
用docker安装测试crate数据库
数据库·docker·容器·cratedb
H5css�海秀8 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
anzhxu8 小时前
QT数据库(三):QSqlQuery使用
数据库·qt·oracle
身如柳絮随风扬8 小时前
MySQL核心知识
数据库·mysql
德彪稳坐倒骑驴8 小时前
Oracle 11g安装
数据库·oracle
SuniaWang8 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长8 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34168 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端