深入剖析MongoDB的并发控制和事务隔离级别-b-确保数据一致性-b (深入剖析mybatis核心原理 拉勾)
并发控制
MongoDB 采用乐观并发控制策略,通过版本号控制并发读写。
每个文档中都有一个隐藏字段
_version
,存储当前版本号。更新时,系统会判断该版本号是否与当前版本对应:
- 如果对应,则更新成功。
- 否则,抛出错误。
MongoDB 同时设置多种锁来控制并发,如读锁和写锁。读操作获取读锁,写操作获取写锁。获取写锁时,如果文档正在被读取或写入,则阻塞等待。
事务隔离级别
MongoDB 从 4.0 版本开始支持多文档事务和 ACID 属性(原子性、一致性、隔离性、持久性)。
通过设置事务隔离级别,可以保证数据的一致性。
MongoDB 支持四种事务隔离级别:
-
ReadUncommitted(读未提交)
在该级别下,事务可以读取到其他未提交的事务所做的更改。
- 最不保证数据一致性。
- 因此,只能在查询操作时使用多文档事务。
-
ReadCommitted(读已提交)
在该级别下,事务只能读取到已提交事务所产生的更改。
- MongoDB 的默认隔离级别。
- 支持读/写操作,通过悲观锁控制数据变更。
- 存在脏读和不可重复读问题。
-
RepeatableRead(可重复读)
在该级别下,事务可以多次读取相同的数据,始终读到相同的结果。
- 支持读/写操作,通过乐观并发控制控制数据变更。
-
Serializable(串行化)
在该级别下,所有事务都被串行执行,每个事务锁定它读取的每个文档。
- 保证最高的数据一致性。
- 支持读/写操作,影响并发性和性能。
- 不适合高并发的场景。
总结
MongoDB 的隔离级别提供了多种选择,可根据应用需求保证数据一致性和并发性。
MongoDB 4.2 及以上版本支持分片事务,在集群环境下执行跨分片事务,支持大规模应用的事务管理。
需要注意,MongoDB 的事务仅适用于单个数据库实例,不适用于分布式系统。
在分布式系统中,需采用其他方式实现分布式事务的隔离、提交和回滚操作。
事务的隔离级别是什么?
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
1、Read uncommitted
读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
2、Read committed
读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
3、Repeatable read
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。
4、Serializable 序列化
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
事务隔离级别有哪些?
事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。事物的并发操作中可能休闲脏读,不可重复读,幻读。
1、第一种隔离级别:Read uncommitted(读未提交)
![拉勾](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据。
解决了更新丢失,但还是可能会出现脏读。
2、第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
解决了更新丢失和脏读问题。
3、第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据,这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务,写事务则禁止任何其他事务,这样避免了不可重复读和脏读,但是有时可能会出现幻读。
读取数据的事务可以通过“共享读镜”和“排他写锁”实现。
解决了更新丢失、脏读、不可重复读、但是还会出现幻读。
4、第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。
序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。
事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
以上内容参考:事务隔离级别 - 网络百科
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。