数据库隔离性允许事务在执行时,好像没有其他并发运行的事务存在一样。
下面的图示演示了四个隔离级别。
🔹Serializable(可串行化):这是最高的隔离级别。并发事务保证按顺序执行。
🔹Repeatable Read(可重复读):事务期间读取的数据与事务开始时相同。
🔹Read Committed(已提交读):只能在事务提交后读取数据修改。
🔹Read Uncommitted(未提交读):在事务提交前,数据修改可以被其他事务读取。
隔离性由MVCC(多版本一致性控制)和锁定保证。
上面的图示以可重复读为例,演示了MVCC如何工作:
对于每一行,都有两个隐藏的列:transaction_id和roll_pointer。当事务A开始时,将创建一个transaction_id = 201的新Read View。不久之后,事务B开始,创建一个transaction_id = 202的新Read View。
现在,事务A将余额修改为200,创建了一行新的日志记录,并且roll_pointer指向旧的行。在事务A提交之前,事务B读取了余额数据。事务B发现事务ID 201未提交,因此它读取下一个提交的记录(transaction_id = 200)。
即使事务A提交后,事务B仍然根据事务B开始时创建的Read View读取数据。因此,事务B始终读取余额为100的数据。