Mysql中的锁
mysql的锁
问题1 : 如何查看mysql的自动提交的设置?
select @@autocommit; 查看默认提交的状态是否是自动提交 0手动提交 1 自动提交
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 将死锁中获取锁定最小的事务进行回滚。(锁定回滚法)