mvcc实现读已提交和可重复读

1.读未提交,最简陋的模式,无法解决任何并发问题。

2.串行化,直接加表锁独占,彻底解决各种问题,不然怎么能是最有效的呢。

3.读已提交和可重复读,均使用多版本控制方式,即mvcc。

版本链:每次个事务都有自己的id。事务修改数据时,undo log版本链中也新增一个版本和该事务的id。

使用快照找版本:通过快照查找版本,快照中有当前事务的id和进行中事务的id。如果版本链中的id与当前事务的id对应就直接使用,否则就去找比当前进行中的事务的最小的id还小的版本使用。

读已提交和可重复读如何实现:读已提交每次都是用同一个快照,当前读是每次生成一个新的快照。

### 关于 openGauss 中不可重复的问题及其解决方案 #### 不可重复的概念 不可重复是指在同一事务中多次执行相同的查询时,返回的结果集不一致的现象。这通常是由于其他并发事务修改了当前事务正在访问的数据并提交所致。 #### openGauss 的隔离级别与不可重复的关系 openGauss 支持两种主要的隔离级别:提交(Read Committed)可重复(Repeatable Read)。两者的区别在于如何处理快照的获取频率以及是否允许不可重复现象的发生[^1]。 - **提交(Read Committed)** 在此隔离级别下,每次 SQL 查询都会重新获取最新的数据快照。这意味着如果其他事务在此期间更新了某些记录,则当前事务可能会看到这些变化。因此,在提交模式下,不可重复问题是被接受的,因为该级别的设计目标是确保只取到已经提交的数据,而不会关注同一事务内的结果一致性[^2]。 - **可重复(Repeatable Read)** 可重复通过在整个事务生命周期内固定一次初始快照来防止不可重复的情况发生。一旦事务开始,它将持续使用这个固定的快照直到结束为止,从而保证即使有其他事务对相同数据进行了更改并提交,本事务仍然能够保持其视图不变,有效解决了不可重复问题。 #### 解决方案概述 为了彻底消除不可重复的风险,建议将数据库会话设置为更高的隔离等级——即“可重复”。这样可以利用 MVCC 快照技术保障整个事务过程中所见数据的一致性。然而需要注意的是提高隔离级虽然增强了数据安全性但也可能带来性能开销增加等问题所以在实际应用当中应权衡考虑业务需求与系统效率之间的关系做出合理选择。 ```sql -- 设置事务隔离级别为 REPEATABLE READ SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` #### 动态规划与遗传算法在多表连接中的作用 尽管上述讨论集中在隔离级别上以解决不可重复问题,但值得一提的是 openGauss 还采用了先进的优化策略如动态规划遗传算法用于复杂查询特别是涉及多个表格间的联接操作时寻找最优执行计划。这对于大规模数据分析场景尤为重要因为它可以帮助减少因不当索引或者错误估计而导致额外资源消耗的可能性同时进一步提升整体吞吐量表现[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值