您好,登錄后才能下訂單哦!
本篇內容主要講解“mysql如何實現分布式鎖”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“mysql如何實現分布式鎖”吧!
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; } }
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; }
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); //寫 }
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(); } } }
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
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.lau.mysql.dao.LockDao"> <resultMap id="BaseResultMap" type="com.lau.mysql.entity.LockPo"> <id column="id" property="id" jdbcType="BIGINT"/> </resultMap> <insert id="create" parameterType="java.lang.Long"> insert into t_lock(id) values(#{id}); </insert> <insert id="del" parameterType="java.lang.Long"> delete from t_lock where id = #{id}; </insert> </mapper>
CREATE TABLE `t_lock` ( `id` BIGINT(11) COMMENT 'ID', PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8
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(); } } }
分布式鎖-線程: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張
缺點:
① 性能低下(頻繁磁盤io)
② 產生死鎖概率高
③ 不太適合太高并發場景
④ waitLock()方法頻繁地輪詢不優雅
到此,相信大家對“mysql如何實現分布式鎖”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。