Mysql中的锁

mysql的锁

问题1 : 如何查看mysql的自动提交的设置?

select @@autocommit; 查看默认提交的状态是否是自动提交 0手动提交 1 自动提交

在这里插入图片描述

问题2 :怎么设置autocommit;

set @@autocommit=0;

设置的是本次mysql 窗口的自动提交取消,不影响别的连接的自动提交 查看怎么锁定了行锁的例子的演示 1 开启事务 未提交;

在这里插入图片描述

 

2 重新打开一个连接,更新锁定的行的内容 ,一直等待释放锁

在这里插入图片描述

 

 

 

3 第一个连接提交完,释放锁

在这里插入图片描述

 

4 第二次的跟新获得锁得以提交

在这里插入图片描述

 

5 如果长时间未获得锁,返回的错误超时

在这里插入图片描述

 

 

 

排它锁:

又称写锁。若事务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 将死锁中获取锁定最小的事务进行回滚。(锁定回滚法)

posted @ 2020-06-19 11:27  子非鱼且于  阅读(165)  评论(0编辑  收藏  举报
Live2D