论JAVA实现MYSQL 行级锁(分布式锁实现方案一)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Override
    @Transactional
    public String getCustomerId() {
//        return String.valueOf(getSequenceId(SEQ_CUSTOMER_ITEM_CODE.seqName));
        String type=SEQ_CUSTOMER_ITEM_CODE.seqName;
 
        if (!sequenceValueMap.containsKey(type)) {
            SequenceDO sequenceDO = sequenceDOMapper.getBySeqNameForUpdate(type);
            LOGGER.info(Thread.currentThread().getName()+"===="+sequenceDO.getCurrentValue());
            sequenceValueMap.put(type, sequenceDO);
            //更新值
            int value = sequenceDO.getCurrentValue();
            sequenceDOMapper.updateSequenceValue(type, sequenceDO.getCurrentValue() + sequenceDO.getStep());
            sequenceDO.setCurrentValue(value + 1);
            LOGGER.info(Thread.currentThread().getName()+"----------->CurrentSequenceType:[{}],value:[{}]", type, sequenceDO.getCurrentValue());
 
            return sequenceDO.getCurrentValue()+"";
        } else {
            SequenceDO sequenceDO = sequenceValueMap.get(type);
            int value = sequenceDO.getCurrentValue() + 1;
            if (value % sequenceDO.getStep() == 0) {
                //更新值
                SequenceDO temp = sequenceDOMapper.getBySeqNameForUpdate(type);
                LOGGER.info(Thread.currentThread().getName()+"----------->CurrentSequenceType:[{}],value:[{}]", type, temp.getCurrentValue());
                sequenceDOMapper.updateSequenceValue(type, temp.getCurrentValue() + temp.getStep());
                sequenceValueMap.put(type, temp);
            } else {
                sequenceDO.setCurrentValue(value);
            }
            return value+"";
        }
    }

  使用行级锁 一定要注意 加上事务控制   MYSQL 行级锁才会起效,才会以排他的形式  访问

-12-26 20:03:20.562  INFO  39993---[Thread-22]   c.s.m.s.i.SequenceServiceImpl - Thread-22====100198439
2019-12-26 20:03:20.572  INFO  39993---[Thread-22]   c.s.m.s.i.SequenceServiceImpl - Thread-22----------->CurrentSequenceType:[sequenceCustomerInfo],value:[100198440]
2019-12-26 20:03:20.577  INFO  39993---[ZkClient-EventThread-23-127.0.0.1:2181]   o.I.z.ZkEventThread - Terminate ZkClient event thread.
2019-12-26 20:03:20.580  INFO  39993---[Thread-23]   c.s.m.s.i.SequenceServiceImpl - Thread-23====100198440
2019-12-26 20:03:20.581  INFO  39993---[DubboShutdownHook]   o.a.z.ZooKeeper - Session: 0x100048539830052 closed
2019-12-26 20:03:20.581  INFO  39993---[main-EventThread]   o.a.z.ClientCnxn - EventThread shut down
100198440
2019-12-26 20:03:20.589  INFO  39993---[Thread-23]   c.s.m.s.i.SequenceServiceImpl - Thread-23----------->CurrentSequenceType:[sequenceCustomerInfo],value:[100198441]

 

posted @   陶朱公Boy  阅读(2386)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2018-12-26 轻松理解UML用例图时序图类图的教程
点击右上角即可分享
微信分享提示