活动地址:CSDN21天学习挑战赛
读读共享,读写互斥,写写互斥
共享锁
又称之为读锁
,简称s锁
,鸡多个事务对于同一数据可以共享一把锁,都能访问到数据,但是不能修改。
排他锁
又称为写锁
,简称x锁
,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享发锁和排他锁,但是获取排他锁的事务可以对数据就行读取和修改。
常⻅的⼏种 SQL 语句的加锁情况如下:
select * from table; #不加锁
update/insert/delete #排他锁
select * from table where id = 1 for update; #id为索引,加排他锁
select * from table where id = 1 lock in share mode; #id为索引,加共享锁
⾏锁
:操作时只锁某⼀(些)⾏,不对其它⾏有影响。开销⼤,加锁慢;会出现死锁;锁定粒度⼩,发⽣锁冲突的概率低,并发度⾼。
表锁
:即使操作⼀条记录也会锁住整个表。开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突概率⾼,并发度最低。
⻚锁
:操作时锁住⼀⻚数据(16kb)。开销和加锁速度介于表锁和⾏锁之间;会出现死锁;锁定粒度介于表锁和⾏锁之间,并发度⼀般。
InnoDB ⾏锁是通过索引上的索引项来实现的。意味者:只有通过索引条件检索数据,InnoDB 才会使⽤⾏级锁,否则,InnoDB将使⽤表锁!
对于主键索引:直接锁住锁住主键索引即可。
对于普通索引:先锁住普通索引,接着锁住主键索引,这是因为⼀张表的索引可能存在多个,通过主键索引才能确保锁是唯⼀的,不然如果同时有2个事务对同1条数据的不同索引分别加锁,那就可能存在2个事务同时操作⼀条数据了。
悲观锁:当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该 数据进行加锁以防止并发问题。
悲观锁优点:数据更加安全,不容易出现并发问题 悲观锁缺点:高并发时对性能较大,而且可能出现死锁现象。
乐观锁:乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时 候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁 适用于读多写少的场景,这样可以提高程序的吞吐量。
乐观锁:更新时带上版本号(cas更新)
悲观锁:使⽤共享锁和排它锁,select…lock in share mode,select