美文网首页
事务隔离级别

事务隔离级别

作者: 何德何能者 | 来源:发表于2019-07-29 16:18 被阅读0次

更新用户金额伪代码

long start = System.currentTimeMillis();
long timeout = 3 * 1000L;
while(true) {
  if(获取分段分布式锁成功) {
   try {
      User user = getUser(id);
      Long beforeUpdateTime = user.getUpdateTime();
      user.setMoney(user.getMoney() + 10); // 给用户加钱
      int count = updateUser(user, beforeUpdateTime); // 乐观锁更新用户金额
      if(count > 0) {
        // 记录日志
      }else {
        // 没更新成功,继续尝试
      }
    }finally{
      boolean releaseLock = // 释放分布式锁
      if(!releaseLock) {// 抛出运行时异常}
    }
  }
  if(System.currentTimeMillis() - start >= time) {
     // 超时,抛出运行时异常
  }
}

以上是段用分布式锁和数据库乐观锁的方式更新用户金额;代码本身没什么问题,可是后期表现处理的却是出现很多超时处理失败回滚的现象;

经过缜密的分析发现,循环里getUser(id)获取的数据不是数据库最新的,导致update乐观锁更新失败; 原因跟数据库的事务隔离级别有关; 由于使用的是默认的隔离级别,这里mysq默认的事务隔离级别是REPEATABLE-READ ;即可重复读;
mysql一共提供四种隔离级别;

  • READ-UNCOMMITTED 可读未提交(即一个事务可以读取到另一个事务已经修改但未提交的数据)
  • READ-COMMITTED 读已提交(即一个事务读取到的数据是其他事务已经提交的数据,未提交的数据不可见)
  • REPEATABLE-READ 可重复读(即一个事务开启后同一个查询的结果始终一致, 即使过程中数据被其他事务修改)
  • SERIALIZABLE 串行(即事务是串行执行,不会有并发问题,但是效率低)

相关文章

  • Spring 中的事务隔离级别

    什么是事务隔离级别? 事务隔离级别是对事务 4 大特性中隔离性的具体体现,使用事务隔离级别可以控制并发事务在同时执...

  • MySQL_tx_isolation

    事务隔离级别 一、数据库事务隔离级别数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、...

  • MySQL事务隔离级别和实现原理,看这一篇就够了!!!

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么...

  • 面试题

    基础知识 1、事务隔离级别 补充: 1、事务隔离级别为读提交时,写数据只会锁住相应的行 2、事务隔离级别为可重复读...

  • 数据库事务相关

    事务隔离级别(tx_isolation)mysql 有四级事务隔离级别 每个级别都有字符或数字编号 级别symbo...

  • 关于Spring的事务Transactional,锁同步,并发线

    Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。...

  • Mysql事务

    事务隔离级别 事务隔离级别有四种:read-uncomitted,read-commited,repeatable...

  • mysql事务-2020-11-21

    use test查询事务隔离级别:select @@tx_isolation; 设置事务隔离级别://全局的set...

  • MYSQL事务

    常用语句 MYSQL事务,锁表 事务控制语句 事务的隔离级别 隔离级别描述产生风险READUNCOMMITTED ...

  • 事务

    事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了...

网友评论

      本文标题:事务隔离级别

      本文链接:https://www.haomeiwen.com/subject/tibbrctx.html