在数据库并发读写时会出现什么情况?数据库中的锁是用来做什么的?乐观锁和悲观锁的区别?MySQL中有行锁和表锁的区别?

  • 数据库中并发读写时出现的问题:
    1. 不可重复读:事务T1读取某一数据后,事务T2执行更新操作,使T1无法再现前一次读取结构
    2. 丢失更新:两个事务T1、T2同时读入统一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失
    3. 读脏数据:事务T1修改某一数据并将其写回磁盘,事务T2读取统一数据后,T2由于某种原因被撤销,这时被T1修改过的数据回复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据

 

  • 数据库中的锁是用来干什么的?
    1. 锁是最常用的并发控制机构。
    2. 是防止其他事务访问指定的资源,控制、实现并发控制的一种主要手段。
    3. 锁是事务对数据库中的资源(如表和记录)存取前,先像系统提出请求,封锁该资源,事务获得锁后,即取得对资源的控制权,在事务释放它的锁之前,其他事务不能更新此数据。当事务撤销后释放被锁定的资源。
    4. 当一个用户锁住数据库中的某个对象时,其他用户不能再访问该对象。
    5. 锁的模式:
      • 排他锁(X锁):又称独占锁,如果数据对象加上排他锁,那么其他事不能对它进行读取和修改。
      • 共享锁(S锁):又称读锁,如果数据对象加上共享锁,那么该数据库对象可以被其它事务读取,但是不能修改和删除数据。(只能都不能修改)

 

  • 悲观锁与乐观锁的区别及优缺点
    1. 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
    2. 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
    3. 两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

 

  • Mysql中有行锁和表锁的区别:
    1. 表锁偏向myisam存储引擎,行锁偏向innodb存储引擎
    2. 表锁开销小,行锁开销大
    3. 表锁的锁粒度大,行锁的锁粒度小
    4. 行锁:
      • 特点:特点-----锁的粒度小,发生锁冲突的概率低、处理并发的能力强;开销大、加锁慢、会出现死锁
      • 加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁
    5. 表锁:
      • 特点:开销小、加锁快、无死锁;锁粒度大,发生锁冲突的概率高,高并发下性能低
      • 加锁的方式:自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁
    6. 锁机制:Mysql有很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁;这些锁统称为悲观锁

 

 

 

 

 

posted @ 2022-04-02 12:49  Nafisa·Nur  阅读(113)  评论(0)    收藏  举报