MySQL中的锁 - 邱乘屹的个人技术博客

排它锁:

又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
排它锁,也称作独占锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释放之后才可能获取到锁。又称:x锁, w 锁
例子:

共享锁

又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
共享锁就是允许多个线程同时获取一个锁,一个锁可以同时被多个线程拥有。又称为:s锁, r锁
例子:

锁的粒度

表锁: mysql 中最基本的锁策略,并且是开销最小的策略,锁定整张表,阻塞其他用户对该表的读取和写入,只有在没有写锁的时候在能获取读锁,读锁之间不阻塞。
行锁: 最大程度支持了并发 ,但是这个方式也极大增加了锁的开销。

死锁

死锁的定义是指两个或者两个以上的事务,再同一资源上的相互占用,并请求对方锁定占用的资源,从而造成的恶性循环。
造成死锁的原因:1 事务的执行顺序,这个很难避免。2 有些是数据引擎的实现方式引起的。

如何解决: 1 数据库检测死锁和死锁超时机制 例如innodb 检测到死锁会返回一个错误。
2 就是事务等待时间设置超时,自动放弃锁的请求,这种不太友好
3 innodb 将死锁中获取锁定最小的事务进行回滚。(锁定回滚法)

猜你喜欢

转载自blog.csdn.net/weixin_47074764/article/details/106845438
今日推荐