程序员过关斩将——数据库的乐观锁和悲观锁并非真实的锁( 四 )

锁是数据库中最为重要的机制之一 , 无论平时写的select语句 , 还是update语句其实在数据库层面都和锁息息相关 。 如果没有锁机制 , 操作数据的时候可能会发生以下情况:

1. 更新丢失:多个用户同时对一个数据资源进行更新 , 必定会产生被覆盖的数据 , 造成数据读写异常 。

2. 不可重复读:如果一个用户在一个事务中多次读取一条数据 , 而另外一个用户则同时更新啦这条数据 , 造成第一个用户多次读取数据不一致 。

3. 脏读:第一个事务读取第二个事务正在更新的数据表 , 如果第二个事务还没有更新完成 , 那么第一个事务读取的数据将是一半为更新过的 , 一半还没更新过的数据 , 这样的数据毫无意义 。

4. 幻读:第一个事务读取一个结果集后 , 第二个事务 , 对这个结果集经行增删操作 , 然而第一个事务中再次对这个结果集进行查询时 , 数据发现丢失或新增 。

数据管理角度

在数据库管理的角度或者数据行的角度来说 , 数据库锁可以分为共享锁和排它锁 , 这是面试过程中经常被提及的两种类型 。 本质其实很简单 , 站在数据的角度来看 , 如果数据当前正在被访问 , 下一个访问的请求该如何处理?和计算机二进制一样 , 无非就是允许被访问和不允许访问两种状态 。

推荐阅读