如何知晓一个SQL锁了多少行数据

针对select … for update语句,知道它锁了多少行吗?(针对当前执行的或者历史执行的)。

啥版本的ob?

  1. 对于ob 4.2(含) 以上版本可以参考视图 GV$OB_LOCKS:OceanBase分布式数据库-海量数据 笔笔算数

如果是行锁的话,结合id2可以看到锁定的行rowkey

  1. 如果低于4.2版本的ob, 结合 行锁持有者(__all_virtual_trans_lock_stat ),行锁等待者(__all_virtual_lock_wait_stat )去判断

这个准吗?此前的版本,当 锁住的记录超过一定数量后(可能是某个内部内存使用达到某个限制后),这个视图就不记录了。

不记录的也能理解。当一个事务锁住上千万笔记录,如果在这个视图里记录上千万个rowkey,感觉也很恐怖。

这几张内部表也是有过期机制在的,极端场景下会过期掉数据。所以不能把他当成全量数据来看待。通过这几张内部表能定位到表级别,结合其他视图能定位到具体的session,锁冲突的场景解决问题基本也就够了。