1、前言
这次我们只谈数据库。以往遇到并发事务问题,总想着站在应用层面考虑问题,该如何实现悲观锁和乐观锁?但并不很清楚数据库中底层的实现原理。找几个晚上重新温习了一下大学课堂上的《数据库系统概览》,借这篇文章记下来这次读书的概要。
2、四个特性 ACID
如果想要说明一个数据库或者一个框架支持事务性操作,则必须要满足下面的四大特性。
原子性(Atomicity):原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
持久性(Durability):持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。
3、四种隔离级别
在数据库事务的ACID四个属性中,隔离性是一个最常放松的一个。可以在数据操作过程中利用数据库的锁机制或者多版本并发控制机制获取更高的隔离等级。但是,随着数据库隔离级别的提高,数据的并发能力也会有所下降。所以,如何在并发性和隔离性之间做一个很好的权衡就成了一个至关重要的问题。
3.1、并发问题
实际开发过程中,我们绝大部分的事务都是有并发情况。当多个事务并发运行,经常会操作相同的数据来完成各自的任务。在这种情况下可能会导致以下的问题:
脏读:指一个事务A正在访问数据,