MySQL(InnoDB存储引擎)默认是自动提交事务的,因此这个测试,须要先将MySQL的autocommit设置为0,关闭自动提交,须要本身手动提交事务session
-- 关闭自动提交
set autocommit=0;
-- 开启事务
begin;
这里我主要针对的是悲观锁,其实也就是行锁和表锁,SQL 加上 FOR UPDATE 便可测试
这个时候,咱们再开启一个客户端访问MySQL,输入同一条加锁的SQL查询spa
这个时候是没有任何结果的,由于t_card表已经加锁了(这个时候其实加的是行锁),因此cardid=‘1’ 这一行的其余加锁操做是无效的3d
可是不加锁查询这一条记录倒是能够的code
也就是说虽然这一条记录所在的行被锁定了,可是并不影响咱们正常的查询,固然了针对这一行的DML操做也是无效的blog
那若是咱们对除了cardid=‘1’ 的其余行操做会怎样呢?事务
对于其余的行DML是彻底没问题的,因此我在前面才说这是行锁,由于只有咱们的cardid=‘1’的行被锁了博客
好吧,咱们放过cardid=‘1’这一行吧it
提交事务以后,另外一边的加锁SQL才会生效io
上面咱们测试的只是行锁,那表锁,或者说怎样才会发生表锁?
没错,咱们不根据主键查询,而是查询全部的记录,MySQL就对整张表加锁了,这不就是表锁了嘛。对于这张表的任何记录进行DML都是无效的
同时咱们对于这张表的任何行进行加锁SQL操做是无效的,那普通的SQL查询又怎样呢?
还好,这不妨碍咱们的普通查询,毕竟查询是与锁这东西没什么缘分的
只要有锁存在的地方(不管是一行仍是整张表),咱们对有锁的地方进行任何加锁SQL都是无效的,固然了DML也是无效的;可是咱们的普通查询是没有问题的,同时对于没有锁的行也是能够进行DML操做的
至于如何解除锁,能够查看这篇博客: https://zhengdl126.iteye.com/blog/1570865 。最后记得把MySQL的autocommit = 1
Oracle是须要咱们手动提交事务的,因此,咱们不须要任何设置便可测试
只有提交事务以后,另外一边才会生效,一样的普通查询是没有问题的。若是不根据主键查询,就会锁整张表。最后的结论是与MySQL一致的
-- 查看哪张表被锁
SELECT object_name, machine, s.sid, s.serial#, logon_time, locked_mode
FROM gv$locked_object l, dba_objects o, gv$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
-- 解锁(根据上边SQL查询结果获得sid和serial#)
--alter system kill session 'sid,serial#';
ALTER system kill session '23,1647';