行锁

线程a锁定id=1的行
此时线程a未提交事务

  1. start TRANSACTION;
  2. select * from testa where id=1 for update;

线程b此时开始请求锁住id=1的行
会一直处于等待
image.png
线程a开始提交事务
commit
image.png
事务b这边立刻完成锁行的操作
image.png

并发情况下,资源锁

作用:同一时间,只有一个事务可以对数据库的某个资源,做写的操作。

资源表
image.png

当有线程要处理某个资源(写操作)时候,先要获取该资源的锁

  1. @Select(" select interface_value from t_interface_lock where interface_code = #{code} and interface_value ='y' for update skip locked ")
  2. public String lockSource(@Param("code") String code@Select(" select interface_v);
  1. String lock = interfaceLockDao.lockSource("syncProduct");
  2. if (StringUtil.isNull(lock))
  3. {
  4. System.out.println("商品增量同步调度未能抢到锁,调度终止,节点IP:" + IPAddressUtil.getHostAddressStr());
  5. return null;
  6. }

执行interfaceLockDao.lockSource(“syncProduct”);后,表中syncProduct对应的行会被当前事务锁住,期间其他线程想要操作给数据,会处于阻塞等待,指导当前线程事务释放了该行锁。