数据库的隔离级别和实现原理
在正常开发过程中,我们通常与数据库进行交互,但今天我们将介绍数据库中的隔离级别和相应的实现原理。
读取未提交) )。
一个事务可以读取其他事务未提交的数据中的变化。 因此,读取其他会话未提交的事务称为脏读现象,在生成环境中很少使用。 在本博客中没有特别详细的说明。
读取已提交(读取) ) ) ) ) )。
在已读取提交的隔离级别上,既不会出现脏读,也不会出现脏写。
无日期就绪
如果一个事务正在向数据库写入数据,但事务尚未提交或结束,则如果其他事务可以看到未提交的事务提交的数据,则这是脏读下图显示了脏领导
从上图中可以看到,用户2只能看到用户1提交事务后的数据,当用户1执行命令set x=3时,用户2在检查x的值时仍然可以看到2。
无日期写入
如果一个事务正在向数据库写入数据,但事务尚未提交,则另一个事务覆盖了上一个事务中未提交的数据,则称为dirty write。 如下图所示:
从上图可以看出,聪明的糖原执行了第一个update语句后,Bob执行也执行了update语句。 可见Bob的更新操作涵盖了聪明的糖原更新操作; 后来聪明糖豆的第二个update覆盖了Bob的第二个update语句,最后导致Listings表和Invoices表的数据不一致。
实现读建议的原理
dirty writes:数据库如何使用行级锁定来避免dirty writes。 如果事务修改记录,则必须首先获取记录的锁定。 在事务提交或结束之前,不会释放保留的锁定。 如果此记录的锁定由事务维护,则修改同一记录的其他事务只能等待。
如何避免dirty reads:也可以像避免dirty writes一样避免dirty reads。 在读取某个记录之前,首先获取此记录的锁定,在读取完成后解除锁定。 但是,如果此方法效率不高,并且需要长时间运行的写入事务正在运行,则在保持锁定的同时读取此记录的事务
由于效率问题,大多数数据库都采用其他方法避免了dirty reads。 对于写入的每个对象,数据库记录之前的旧值和当前事务保持写入锁定的新值。 事务执行时,数据库在读取已修改的记录时返回旧值。 提交上一个事务时,返回新值。
Repeatable Read (可重复读取) ) )。
MySQL的默认隔离级别。 在事务处理中,可以在事务处理开始后立即重复读取看到的数据,直到事务处理结束。 在此期间,数据保持不变,避免脏读,无法重复读取。 但是,那解决不了幻读的问题。
不要重复
一个事务读取一个数据两次并读取不同的数据意味着一个事务在读取操作期间读取了另一个事务对旧数据的更改。 例如,假设您打开一个事务,修改一个数据,首先检查,然后修改,然后在执行修改操作时发现另一个事务删除了该数据。 或者,下图所示例子:
在上图中,帐户1和帐户2可以理解为帐户表中的两个记录。 用户聪明的扁豆在银行有两个账户,她现在把账户1的100元转移到账户2。 在聪明的扁豆事务操作中,首先账户1的余额是500,在查账户2的余额之前,另一个事务会把账户1的100元转移到账户2。两个账户的总额是900元而不是1000元。 这个时候,用户聪明的扁豆一定会得到难以置信的。 在此示例中,数据库符合读建议隔离级别。 聪明的菜豆执行第二次查询时,可以看到另一个事务执行后的数据状态。
可重复读取的实现原理