锁缺失的隐患

  1. 更新丢失:多个用户同时对一个数据资源进行更新,必定会产生被覆盖的数据,造成数据读写异常。
  1. 脏读:第一个事务读取第二个事务正在更新的数据表,如果第二个事务还没有更新完成,那么第一个事务读取的数据将是一半为更新过的,一半还没更新过的数据,这样的数据毫无意义。
  2. 不可重复读:如果一个用户在一个事务中多次读取一条数据,而另外一个用户则同时更新了这条数据,造成第一个用户多次读取数据不一致。
  3. 幻读:第一个事务读取一个结果集后,第二个事务,对这个结果集经行增删操作,然而第一个事务中再次对这个结果集进行查询时,数据发现丢失或新增

数据管理角度

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

  • 共享锁

共享锁被称为读锁或者S锁,就像以上所述,共享锁在新请求访问一个数据的时候,如果是读请求则允许,如果是写(删改)请求,则不允许。由于共享锁允许其他的读操作,所以通常情况下共享锁只应用于select操作,如果一个update或者delete操作应用共享锁会发生很严重的数据不一致情况。

  • 独占锁

独占锁也被称为排它锁或者X锁,相对于共享锁,独占锁采用的态度比较坚决,一旦数据被独占锁锁定,其他任何请求(包括读操作)都必须等待独占锁的释放才可以继续,只有当前锁定数据的请求才可以修改读取数据

  • 更新锁

当数据库准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。

  • 意向锁

简单来说就是给更大一级别的空间示意里面是否已经上过锁。例如表级放置了意向锁,就表示事务要对表的页或行上使用共享锁。在表的某一行上上放置意向锁,可以防止其它事务获取其它不兼容的的锁。意向锁可以提高性能,因为数据引擎不需要检测资源的每一列每一行,就能判断是否可以获取到该资源的兼容锁。意向锁包括三种类型:意向共享锁(IS),意向排他锁(IX),意向排他共享锁(SIX)。

乐观锁和悲观锁