数据库隔离级别 及 其实现原理

    有关数据库隔离级别及其实现原理,这里有一则超级好贴: http://comedsh.iteye.com/blog/698733数据库

    我这4种隔离级别的相应原理总结以下:code


###READ_UNCOMMITED 的原理:blog

  • 事务对当前被读取的数据不加锁;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 **行级共享锁**,直到事务结束才释放。

表现:事务

  • _事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,能读到事务2对该记录的修改版本,即便该修改还没有被提交。_
  • _事务1更新某行记录时,事务2不能对这行记录作更新,直到事务1结束。_

###READ_COMMITED 的原理:get

  • 事务对当前被读取的数据加 **行级共享锁(当读到时才加锁)**,一旦读完该行,当即释放该行级共享锁;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 **行级排他锁**,直到事务结束才释放。

表现:it

  • _事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的只能是事务2对其更新前的版本,要不就是事务2提交后的版本。_
  • _事务1更新某行记录时,事务2不能对这行记录作更新,直到事务1结束。_

###REPEATABLE READ 的原理:原理

  • 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 **行级共享锁**,直到事务结束才释放;
  • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 **行级排他锁**,直到事务结束才释放。

表现:总结

  • _事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的仍然是第一次读取的那个版本。_
  • _事务1更新某行记录时,事务2不能对这行记录作更新,直到事务1结束。_

###SERIALIZABLE 的原理:数据

  • 事务在读取数据时,必须先对其加 **表级共享锁** ,直到事务结束才释放;
  • 事务在更新数据时,必须先对其加 **表级排他锁** ,直到事务结束才释放。

表现:co

  • _事务1正在读取A表中的记录时,则事务2也能读取A表,但不能对A表作更新、新增、删除,直到事务1结束。_
  • _事务1正在更新A表中的记录时,则事务2不能读取A表的任意记录,更不可能对A表作更新、新增、删除,直到事务1结束。_
相关文章
相关标签/搜索