ITPub博客

首页 > 数据库 > 数据库开发技术 > openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用重试中止事务

openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用重试中止事务

原创 数据库开发技术 作者:shuchaoyang 时间:2023-07-01 07:00:00 0 删除 编辑

openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务

openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务

在乐观并发控制(OCC)中,在COMMIT阶段前的事务期间(使用任何隔离级别)不会对记录进行锁定。这是一个能显著提高性能的强大优势。它的缺点是,如果另一个会话尝试更新相同的记录,则更新可能会失败。所以必须中止整个事务。这些所谓的更新冲突是由MOT在提交时通过版本检查机制检测到的。

说明: 使用悲观并发控制的引擎,如标准Postgres和openGauss基于磁盘的表,当使用SERIALIZABLE或REPEATABLE-READ隔离级别时,也会发生类似的异常中止。

这种更新冲突在常见的OLTP场景中非常少见,在使用MOT时尤其少见。但是,由于仍有可能发生这种情况,开发人员应该考虑使用事务重试代码来解决此问题。

下面以多个会话同时尝试更新同一个表为例,说明如何重试表命令。有关更多详细信息,请参阅“OCC与2PL的区别举例”部分。下面以TPC-C支付事务为例。

int commitAborts = 0; 

while (commitAborts < RETRY_LIMIT) {

  try {                        
      stmt =db.stmtPaymentUpdateDistrict;
      stmt.setDouble(1, 100);
      stmt.setInt(2, 1);
      stmt.setInt(3, 1);
      stmt.executeUpdate();

      db.commit();                      

      break;
  }              
  catch (SQLException se) {
       if(se != null && se.getMessage().contains("could not serialize access due to concurrent update")) {
          log.error("commmit abort = " + se.getMessage());
          commitAborts++;
          continue;
      }else {
          db.rollback();
      }

      break;
  }
}


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!


有什么吐槽或反馈意见,直接告诉我!

温馨提示:如出现二维码失效也可直接添加微信号:ysc13803862469。



原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
专注于IT系统集成、运维、架构二十年的IT职场老兵,拥有CCNA、OCA、OCP、PGCA、PGCE认证证书,公众号:超哥的IT私房菜,知识星球:超哥的IT私房菜,目前是多家IT厂商的咨询顾问。

注册时间:2021-08-27

  • 博文量
    552
  • 访问量
    309761