我们在使用数据库的过程中在处理有关金额方面的数据时可能会使用到锁的知识,下面我来给大家演示一下数据库锁的使用
首先我们知道数据库默认是自动提交事务
SET autocommit=0是关闭自动提交
SET autocommit=1是开启自动提交,默认是开启的
我们先关闭自动提交,表a如下
我们执行UPDATE a set name='a3' where id=4
执行之后我们SELECT * FROM `a`
然后在打开另一个临时会话
这时候我们看到解决是不同的,这是因为我们没有提交事务,防止脏读的发生
然后我们commit一下
这时候我们就能看到会话2就可以看到了
接下来我们在会话2执行一下修改方法
我们在会话一执行UPDATE a set name='a3' where id=4
会话2执行UPDATE a set name='a4' where id=4
这时候可以看到会话2是在处于等待操作
这时候我们执行会话1的commit
我们看到会话2执行成功,并且一直在等到执行
这就是产生了一个行锁的竞争
那么什么是表锁呢.表锁是锁住了整个数据表操作,通常发生的场景是在使用条件时加了or作为链接,会产生一个表的锁
比如我们在会话一执行UPDATE a set name='a3' where id=4 or id=5
会话2执行UPDATE a set name='a4' where id=6会锁住就像行锁一样必须等待会话一执行完毕
那么什么是间隙锁呢,你如现在我们是id1 3 5 7 的话
我们会话1执行一个update a set name='a4' where id>1 and id<7的数据
会话2 insert into a values(4,'b6')插入id为4的数据,我们可以看到id并没有4的数据但是因为会话一没有结束,我们也是不会执行操作的
范围锁的灾难性也是比较大的,如果我们表锁住一万行数据,我们就不能操作这一万行数据了
最后我们可以使用show status like 'innodb row lock%'来查看一个数据库的性能和锁的使用情况
show status like 'innodb_row_lock%';
对于各个状态说明如下:
Innodb_row_lock_current_waits:当前正在等待锁的数量;
Innodb_row_lock_time:从系统启动到现在锁定总时间长度;
Innodb_row_lock_time_avg:每次等待所花平均时间;
Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间长度;
Innodb_row_lock_waits:系统启动到现在总共等待的次数;