数据库的锁有哪几种?语句怎么实现

1 为什么需要锁

  数据库是一个多用户共享的资源,当多个用户并发的存储数据时,数据库就会产生多个事物同时存储同一数据的情况。若对并发操作不加控制就可能读取或存取不正确的数据,破坏数据的不正确性(脏读,不可重复读,幻读等),可能产生死锁。为了解决这个问题,加锁是一个非常重要的技术,对实现数据库并发控制是一个好的方案。简单来说,当执行SQL语句事物前,应向数据库发出请求,对你访问的记录加锁。在这个事物释放锁之前,其他事物不能对这个数据进行更新操作。

2 有哪些锁

  MySQL数据库中的锁有共享锁、排他锁、行锁、表级锁、行级锁以及页面锁。

2.1 共享锁(Shared Lock,也叫S锁)

  共享锁(S)表示对数据进行读操作,因此多个事物可以同时为一个对象加锁。这个事物释放锁之前,其他事物不能对该对象进行更新操作。产生共享锁的语句是:

select * from t_user lock in share mode;

2.2 排他锁(Exclusive Lock,也叫X锁)

  排他锁表示对数据进行写操作,如果一个事物给一个对象添加了排他锁,其他事物就不能给他加其他锁。产生排他锁的SQL语句如下:

select * from ad_plan for update;

2.3 行锁

  行锁表示对一条记录加锁,只影响一条记录。通常用在DML语句中,如INSERT, UPDATE, DELETE等。
  InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
  InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

2.4 锁的密度

  根据锁的级别或密度来划分,MySQL有三种锁的级别:页级、表级、行级。

2.4.1 表级锁

  表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。
  当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。
  使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。

2.4.2 行级锁

  行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
  虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
  使用行级锁定的主要是InnoDB存储引擎。

2.4.3 页面锁

  页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
  在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。
  使用页级锁定的主要是BerkeleyDB存储引擎。

发布了39 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a1920135141/article/details/100915289