mysql如何实现分布式锁
本篇内容主要讲解“MySQL如何实现分布式锁”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql如何实现分布式锁”吧!
成都创新互联公司专业为企业提供荆州网站建设、荆州做网站、荆州网站设计、荆州网站制作等企业网站建设、网页设计与制作、荆州企业网站模板建站服务,10多年荆州做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
一、具体实现
1、共享资源类TicketResource
package com.lau.mysql.resource; import org.springframework.stereotype.Component; /** * @ClassName: TicketResource * @Description: TODO * @author Liu * @date 2021年4月18日 下午3:57:38 */ @Component public class TicketResource { private Integer ticket = 20; public String use(){ String res = null; if(this.ticket > 0) { res = "分布式锁-线程:" + Thread.currentThread().getName() + "卖了1张票,火车票还剩:" + (--ticket) + "张"; } else { res = "火车票售罄!"; } System.out.println(res); return res; } }
2、表对象实体LockPo
package com.lau.mysql.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor public class LockPo implements Serializable { private Long id; }
3、dao
package com.lau.mysql.dao; import org.apache.ibatis.annotations.Mapper; import com.lau.mysql.entity.LockPo; @Mapper public interface LockDao { public int create(Long id); //写 public int del(Long id); //写 }
4、controller
package com.lau.mysql.controller; import javax.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.lau.mysql.lock.Lock; import com.lau.mysql.resource.TicketResource; @RestController public class LockController { @Resource private Lock lock; @Resource private TicketResource ticketResource; @GetMapping(value = "/mysql/distributed/lock") public String purchaseTicket(){ try { lock.getLock(); return ticketResource.use(); } finally { lock.unLock(); } } }
5、application.yml
server: port: 8001 spring: application: name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: ****** druid: validationQuery: SELECT 1 mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.lau.mysql.entity
6、LockMapper.xml
insert into t_lock(id) values(#{id}); delete from t_lock where id = #{id};
7、sql
CREATE TABLE `t_lock` ( `id` BIGINT(11) COMMENT 'ID', PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8
8、数据表记录
9、锁相关类
package com.lau.mysql.lock; /** * @ClassName: Lock * @Description: TODO * @author Liu * @date 2021年4月18日 下午3:32:23 */ public interface Lock { void getLock(); void unLock(); }
package com.lau.mysql.lock; /** * @ClassName: LockManager * @Description: 本类采用了模板方法模式 * @author Liu * @date 2021年4月18日 下午3:30:21 */ public abstract class AbstractLock implements Lock{ @Override public void getLock() { if(this.tryLock()) { } else { this.waitLock(); this.getLock(); } } public abstract Boolean tryLock(); public abstract void waitLock(); }
package com.lau.mysql.lock.impl; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.lau.mysql.dao.LockDao; import com.lau.mysql.lock.AbstractLock; /** * @ClassName: LockImpl * @Description: TODO * @author Liu * @date 2021年4月18日 下午3:46:34 */ @Component public class LockImpl extends AbstractLock{ @Autowired private LockDao lockDao; @Override public void unLock() { lockDao.del(1L); } /** * 注意如果已存在主键id 1,再次调用此方法会抛出异常,返回false(锁互斥) */ @Override public Boolean tryLock() { try { int create = lockDao.create(1L); return create > 0; } catch (Exception e) { return false; } } @Override public void waitLock() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }
10、输出
分布式锁-线程:qtp879353005-178卖了1张票,火车票还剩:19张 分布式锁-线程:qtp879353005-175卖了1张票,火车票还剩:18张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:17张 分布式锁-线程:qtp879353005-180卖了1张票,火车票还剩:16张 分布式锁-线程:qtp879353005-179卖了1张票,火车票还剩:15张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:14张 分布式锁-线程:qtp879353005-180卖了1张票,火车票还剩:13张 分布式锁-线程:qtp879353005-179卖了1张票,火车票还剩:12张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:11张 分布式锁-线程:qtp879353005-180卖了1张票,火车票还剩:10张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:9张 分布式锁-线程:qtp879353005-180卖了1张票,火车票还剩:8张 分布式锁-线程:qtp879353005-179卖了1张票,火车票还剩:7张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:6张 分布式锁-线程:qtp879353005-179卖了1张票,火车票还剩:5张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:4张 分布式锁-线程:qtp879353005-180卖了1张票,火车票还剩:3张 分布式锁-线程:qtp879353005-179卖了1张票,火车票还剩:2张 分布式锁-线程:qtp879353005-177卖了1张票,火车票还剩:1张 分布式锁-线程:qtp879353005-180卖了1张票,火车票还剩:0张
二、mysql实现分布式锁的优缺点
缺点:
① 性能低下(频繁磁盘io)
② 产生死锁概率高
③ 不太适合太高并发场景
④ waitLock()方法频繁地轮询不优雅
到此,相信大家对“mysql如何实现分布式锁”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
网站名称:mysql如何实现分布式锁
本文地址:http://ybzwz.com/article/peojih.html