色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

庫(kù)存扣減和鎖常見(jiàn)的實(shí)現(xiàn)方案代碼

Android編程精選 ? 來(lái)源:CSDN博客 ? 作者:北京-小北 ? 2021-11-06 14:48 ? 次閱讀

先說(shuō)場(chǎng)景:

物品W現(xiàn)在庫(kù)存剩余1個(gè), 用戶(hù)P1,P2同時(shí)購(gòu)買(mǎi).則只有1人能購(gòu)買(mǎi)成功.(前提是不允許超賣(mài))

秒殺也是類(lèi)似的情況, 只有1件商品,N個(gè)用戶(hù)同時(shí)搶購(gòu),只有1人能搶到..

這里不談秒殺設(shè)計(jì),不談使用隊(duì)列等使請(qǐng)求串行化,就談下怎么用鎖來(lái)保證數(shù)據(jù)正確.

常見(jiàn)的實(shí)現(xiàn)方案有以下幾種:

  1. 代碼同步, 例如使用 synchronized ,lock 等同步方法
  2. 不查詢(xún),直接更新 update table set surplus = (surplus - buyQuantity) where id = xx and (surplus - buyQuantity) > 0
  3. 使用CAS, update table set surplus = aa where id = xx and version = y
  4. 使用數(shù)據(jù)庫(kù)鎖, select xx for update
  5. 使用分布式鎖(zookeeper,redis等)

下面就針對(duì)這幾種方案來(lái)分析下;

1.代碼同步, 例如使用 synchronized ,lock 等同步方法

面試的時(shí)候,我經(jīng)常會(huì)問(wèn)這個(gè)問(wèn)題,很大一部分人都會(huì)回答用這個(gè)方案來(lái)實(shí)現(xiàn).

偽代碼如下:

publicsynchronizedvoidbuy(StringproductName,IntegerbuyQuantity){
//其他校驗(yàn)...
//校驗(yàn)剩余數(shù)量
Productproduct=從數(shù)據(jù)庫(kù)查詢(xún)出記錄;
if(product.getSurplusreturn"庫(kù)存不足";
}

//set新的剩余數(shù)量
product.setSurplus(product.getSurplus()-quantity);
//更新數(shù)據(jù)庫(kù)
update(product);
//記錄日志...
//其他業(yè)務(wù)...
}

在方法聲明加上synchronized關(guān)鍵字,實(shí)現(xiàn)同步,這樣2個(gè)用戶(hù)同時(shí)購(gòu)買(mǎi),到buy方法時(shí)候同步執(zhí)行,第2個(gè)用戶(hù)執(zhí)行的時(shí)候,會(huì)庫(kù)存不足.

嗯.. 看著挺合理的,以前我也是這么干的. 所以現(xiàn)在碰到別人這樣回答,我就會(huì)在心里默默的想.小伙子你是沒(méi)踩過(guò)這坑啊.

先說(shuō)下這個(gè)方案的前提配置:

  • 使用spring 聲明式事務(wù)管理
  • 事務(wù)傳播機(jī)制使用默認(rèn)的(PROPAGATION_REQUIRED)
  • 項(xiàng)目分層為controller-service-dao 3層, 事務(wù)管理在service層

這個(gè)方案不可行,主要是因?yàn)橐韵聨c(diǎn):

1).synchronized 作用范圍是單個(gè)jvm實(shí)例, 如果做了集群,分布式等,就沒(méi)用了

2).synchronized是作用在對(duì)象實(shí)例上的,如果不是單例,則多個(gè)實(shí)例間不會(huì)同步(這個(gè)一般用spring管理bean,默認(rèn)就是單例)

3).單個(gè)jvm時(shí),synchronized也不能保證多個(gè)數(shù)據(jù)庫(kù)事務(wù)的隔離性. 這與代碼中的事務(wù)傳播級(jí)別,數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別,加鎖時(shí)機(jī)等相關(guān).

3-1).先說(shuō)隔離級(jí)別,常用的是 Read Committed 和 Repeatable Read ,另外2種不常用就不說(shuō)了

3-1-1)RR(Repeatable Read)級(jí)別.mysql默認(rèn)的是RR,事務(wù)開(kāi)啟后,不會(huì)讀取到其他事務(wù)提交的數(shù)據(jù)

根據(jù)前面的前提,我們知道在buy方法時(shí)會(huì)開(kāi)啟事務(wù).

假設(shè)現(xiàn)在有線(xiàn)程T1,T2同時(shí)執(zhí)行buy方法.假設(shè)T1先執(zhí)行,T2等待.

spring的事務(wù)開(kāi)啟和提交等是通過(guò)aop(代理)實(shí)現(xiàn)的,所以執(zhí)行buy方法前,就會(huì)開(kāi)啟事務(wù).

這時(shí)候T1,T2是兩個(gè)事務(wù),當(dāng)T1執(zhí)行完后,T2執(zhí)行,讀取不到T1提交的數(shù)據(jù),所以會(huì)出問(wèn)題.

3-1-2).RC(Read Committed)級(jí)別.事務(wù)開(kāi)啟后,可以讀取到其他事務(wù)提交的數(shù)據(jù)

看起來(lái)這個(gè)級(jí)別可以解決上面的問(wèn)題.T2執(zhí)行時(shí),可以讀取到T1提交的結(jié)果.

但是問(wèn)題是,T2執(zhí)行的時(shí)候, T1的事務(wù)提交了嗎?

事務(wù)和鎖的流程如下

  1. 開(kāi)啟事務(wù)(aop)
  2. 加鎖(進(jìn)入synchronized方法)
  3. 釋放鎖(退出synchronized方法)
  4. 提交事務(wù)(aop)

可以看出是先釋放鎖,再提交事務(wù).所以T2執(zhí)行查詢(xún),可能還是未讀到T1提交的數(shù)據(jù),還會(huì)出問(wèn)題

3-2).根據(jù)3-1中的問(wèn)題,發(fā)現(xiàn)主要矛盾是事務(wù)開(kāi)啟和提交的時(shí)機(jī)與加鎖解鎖時(shí)機(jī)不一致.有小伙伴們可能就想到了解決方案.

3-2-1).在事務(wù)開(kāi)啟前加鎖,事務(wù)提交后解鎖.

確實(shí)是可以,這相當(dāng)于事務(wù)串行化.拋開(kāi)性能不談,來(lái)談?wù)勗趺磳?shí)現(xiàn).

如果使用默認(rèn)的事務(wù)傳播機(jī)制,那么要保證事務(wù)開(kāi)啟前加鎖,事務(wù)提交后解鎖,就需要把加鎖,解鎖放在controller層.

這樣就有個(gè)潛在問(wèn)題,所有操作庫(kù)存的方法,都要加鎖,而且要是同一把鎖,寫(xiě)起來(lái)挺累的.

而且這樣還是不能跨jvm.

3-2-2).將查詢(xún)庫(kù)存,扣減庫(kù)存這2步操作,單獨(dú)提取個(gè)方法,單獨(dú)使用事務(wù),并且事務(wù)隔離級(jí)別設(shè)置為RC.

這個(gè)其實(shí)和上面的3-2-1異曲同工,最終都是講加解鎖放在了事務(wù)開(kāi)啟提交外層.

比較而言?xún)?yōu)點(diǎn)是入口少了. controller不用處理.

缺點(diǎn)除了上面的不能跨jvm,還有就是 單獨(dú)的這個(gè)方法,需要放到另外的service類(lèi)中.

因?yàn)槭褂胹pring,同一個(gè)bean的內(nèi)部方法調(diào)用,是不會(huì)被再次代理的,所以配置的單獨(dú)事務(wù)等需要放到另外的service bean 中

2.不查詢(xún),直接更新

看完第一種方案,有小伙伴就說(shuō)了. 你說(shuō)的那么復(fù)雜,那么多問(wèn)題,不就是因?yàn)椴樵?xún)的數(shù)據(jù)不是最新的嗎?

我們不查詢(xún),直接更新不就行啦.

偽代碼如下:

publicsynchronizedvoidbuy(StringproductName,IntegerbuyQuantity){
//其他校驗(yàn)...
int影響行數(shù)=updatetablesetsurplus=(surplus-buyQuantity)whereid=1;
if(result0){
return"庫(kù)存不足";
}
//記錄日志...
//其他業(yè)務(wù)...
}

測(cè)試后發(fā)現(xiàn)庫(kù)存變成-1了, 繼續(xù)完善下

publicsynchronizedvoidbuy(StringproductName,IntegerbuyQuantity){
//其他校驗(yàn)...
int影響行數(shù)=updatetablesetsurplus=(surplus-buyQuantity)whereid=1and(surplus-buyQuantity)>0;
if(result0){
return"庫(kù)存不足";
}
//記錄日志...
//其他業(yè)務(wù)...
}

測(cè)試后,功能OK;

這樣確實(shí)可以實(shí)現(xiàn),不過(guò)有一些其他問(wèn)題:

  • 不具備通用性,例如add操作
  • 庫(kù)存操作一般要記錄操作前后的數(shù)量等,這樣沒(méi)法記錄
  • 其他...

但是根據(jù)這個(gè)方案,可以引出方案3.

3.使用CAS, update table set surplus = aa where id = xx and yy = y

CAS是指compare/check and swap/set 意思都差不多,不必太糾結(jié)是哪個(gè)單詞

我們將上面的sql修改一下:

int影響行數(shù)=updatetablesetsurplus=newQuantitywhereid=1andsurplus=oldQuantity;

這樣,線(xiàn)程T1執(zhí)行完后,線(xiàn)程T2去更新,影響行數(shù)=0,則說(shuō)明數(shù)據(jù)被更新, 重新查詢(xún)判斷執(zhí)行.偽代碼如下:

publicvoidbuy(StringproductName,IntegerbuyQuantity){
//其他校驗(yàn)...
Productproduct=getByDB(productName);
int影響行數(shù)=updatetablesetsurplus=(surplus-buyQuantity)whereid=1andsurplus=查詢(xún)的剩余數(shù)量;
while(result==0){
product=getByDB(productName);
if(查詢(xún)的剩余數(shù)量>buyQuantity){
影響行數(shù)=updatetablesetsurplus=(surplus-buyQuantity)whereid=1andsurplus=查詢(xún)的剩余數(shù)量;
}else{
return"庫(kù)存不足";
}
}

//記錄日志...
//其他業(yè)務(wù)...
}

看到重新查詢(xún)幾個(gè)字,小伙伴們應(yīng)該就又想到事務(wù)隔離級(jí)別問(wèn)題了.

沒(méi)錯(cuò),所以上面代碼中的getByDB方法,必須單獨(dú)事務(wù)(注意同一個(gè)bean內(nèi)單獨(dú)事務(wù)不生效哦),而且數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別必須是RC,

否則上面的代碼就會(huì)是死循環(huán)了.

上面的方案,可能會(huì)出現(xiàn)一個(gè)CAS中經(jīng)典問(wèn)題. ABA的問(wèn)題.

ABA是指:

  • 線(xiàn)程T1 查詢(xún),庫(kù)存剩余 100
  • 線(xiàn)程T2 查詢(xún),庫(kù)存剩余 100
  • 線(xiàn)程T1 執(zhí)行 sub update t set surplus = 90 where id = x and surplus = 100;
  • 線(xiàn)程T3 查詢(xún), 庫(kù)存剩余 90
  • 線(xiàn)程T3 執(zhí)行add update t set surplus = 100 where id = x and surplus = 90;
  • 線(xiàn)程T2 執(zhí)行sub update t set surplus = 90 where id = x and surplus = 100;

這里線(xiàn)程T2執(zhí)行的時(shí)候,庫(kù)存的100已經(jīng)不是查詢(xún)到的100了,但是對(duì)于這個(gè)業(yè)務(wù)是不影響的.

一般的設(shè)計(jì)中CAS會(huì)使用version來(lái)控制.

updatetsetsurplus=90,version=version+1whereid=xandversion=oldVersion;

這樣,每次更新version在原基礎(chǔ)上+1,就可以了.

使用CAS要注意幾點(diǎn),

  • 失敗重試次數(shù),是否需要限制
  • 失敗重試對(duì)用戶(hù)是透明的

4.使用數(shù)據(jù)庫(kù)鎖, select xx for update

方案3種的cas,是樂(lè)觀鎖的實(shí)現(xiàn), 而select for udpate 則是悲觀鎖. 在查詢(xún)數(shù)據(jù)的時(shí)候,就將數(shù)據(jù)鎖住.

偽代碼如下:

publicvoidbuy(StringproductName,IntegerbuyQuantity){
//其他校驗(yàn)...
Productproduct=select*fromtablewherename=productNameforupdate;
if(查詢(xún)的剩余數(shù)量>buyQuantity){
影響行數(shù)=updatetablesetsurplus=(surplus-buyQuantity)wherename=productName;
}else{
return"庫(kù)存不足";
}

//記錄日志...
//其他業(yè)務(wù)...
}

線(xiàn)程T1 進(jìn)行sub , 查詢(xún)庫(kù)存剩余 100

線(xiàn)程T2 進(jìn)行sub , 這時(shí)候,線(xiàn)程T1事務(wù)還未提交,線(xiàn)程T2阻塞,直到線(xiàn)程T1事務(wù)提交或回滾才能查詢(xún)出結(jié)果.

所以線(xiàn)程T2查詢(xún)出的一定是最新的數(shù)據(jù).相當(dāng)于事務(wù)串行化了,就解決了數(shù)據(jù)一致性問(wèn)題.

對(duì)于select for update,需要注意的有2點(diǎn).

  1. 統(tǒng)一入口:所有庫(kù)存操作都需要統(tǒng)一使用 select for update ,這樣才會(huì)阻塞, 如果另外一個(gè)方法還是普通的select, 是不會(huì)被阻塞的

  2. 加鎖順序:如果有多個(gè)鎖,那么加鎖順序要一致,否則會(huì)出現(xiàn)死鎖.

5.使用分布式鎖(zookeeper,redis等)

使用分布式鎖,原理和方案1種的synchronized是一樣的.只不過(guò)synchronized的flag只有jvm進(jìn)程內(nèi)可見(jiàn),而分布式鎖的flag則是全局可見(jiàn).方案4種的select for update 的flag 也是全局可見(jiàn).

分布式鎖的實(shí)現(xiàn)方案有很多:基于redis,基于zookeeper,基于數(shù)據(jù)庫(kù)等等.

需要注意,使用分布式鎖和synchronized鎖有同樣的問(wèn)題,就是鎖和事務(wù)的順序,這個(gè)在方案1里面已經(jīng)講過(guò).不再重復(fù).

做個(gè)簡(jiǎn)單總結(jié):

  • 方案1: synchronized等jvm內(nèi)部鎖不適合用來(lái)保證數(shù)據(jù)庫(kù)數(shù)據(jù)一致性,不能跨jvm
  • 方案2: 不具備通用性,不能記錄操作前后日志
  • 方案3: 推薦使用.但是如果數(shù)據(jù)競(jìng)爭(zhēng)激烈,則自動(dòng)重試次數(shù)會(huì)急劇上升,需要注意.
  • 方案4: 推薦使用.最簡(jiǎn)單的方案,但是如果事務(wù)過(guò)大,會(huì)有性能問(wèn)題.操作不當(dāng),會(huì)有死鎖問(wèn)題
  • 方案5: 和方案1類(lèi)似,只是能跨jvm
責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7134

    瀏覽量

    89410
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2946

    瀏覽量

    66863

原文標(biāo)題:實(shí)踐角度,談?wù)剮?kù)存扣減和鎖

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電路常見(jiàn)故障及解決方法

    繼電器、按鈕、限位開(kāi)關(guān)等組成。當(dāng)電路中的某個(gè)條件被滿(mǎn)足時(shí),繼電器的常閉觸點(diǎn)會(huì)斷開(kāi),而常開(kāi)觸點(diǎn)會(huì)閉合,從而保持電路的狀態(tài),即使初始條件不再滿(mǎn)足。 常見(jiàn)故障 1. 電路無(wú)法自 故障原因 繼電器損壞或觸點(diǎn)粘連。 按鈕或限位開(kāi)關(guān)
    的頭像 發(fā)表于 01-18 10:05 ?149次閱讀

    電路怎么實(shí)現(xiàn)自動(dòng)控制

    在現(xiàn)代電子技術(shù)中,自動(dòng)控制是實(shí)現(xiàn)智能化和自動(dòng)化的關(guān)鍵。自電路作為一種基本的自動(dòng)控制電路,因其簡(jiǎn)單、可靠和易于實(shí)現(xiàn)的特點(diǎn),被廣泛應(yīng)用于各種自動(dòng)控制系統(tǒng)中。 1. 自電路的工作原理 自
    的頭像 發(fā)表于 01-18 10:04 ?113次閱讀

    電路的類(lèi)型和特點(diǎn)

    在電子工程領(lǐng)域,自電路是一種常見(jiàn)的設(shè)計(jì),它能夠使電路在沒(méi)有持續(xù)的觸發(fā)信號(hào)的情況下保持其狀態(tài)。這種電路的設(shè)計(jì)對(duì)于實(shí)現(xiàn)自動(dòng)化控制和減少人為干預(yù)至關(guān)重要。 一、自電路的類(lèi)型 自
    的頭像 發(fā)表于 01-18 10:03 ?121次閱讀

    庫(kù)存平臺(tái)穩(wěn)定性建設(shè)實(shí)踐

    作者:京東物流 尹昊喆 前言 本文總結(jié)庫(kù)存平臺(tái)穩(wěn)定性建設(shè)中遇到的問(wèn)題以及解決方案。感謝【金鵬】、【孫靜】、【陳瑞】同學(xué)在本文撰寫(xiě)中提供的內(nèi)容及幫助! 庫(kù)存平臺(tái)面臨的穩(wěn)定性挑戰(zhàn) 庫(kù)存平臺(tái)
    的頭像 發(fā)表于 12-11 09:50 ?234次閱讀
    <b class='flag-5'>庫(kù)存</b>平臺(tái)穩(wěn)定性建設(shè)實(shí)踐

    SQL錯(cuò)誤代碼及解決方案

    在SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)和管理中,常見(jiàn)的錯(cuò)誤代碼及其解決方案可以歸納如下: 一、語(yǔ)法錯(cuò)誤(Syntax Errors) 錯(cuò)誤代碼 :無(wú)特定代碼,但
    的頭像 發(fā)表于 11-19 10:21 ?2721次閱讀

    Karmak攜手Syncron實(shí)現(xiàn)庫(kù)存規(guī)劃流程自動(dòng)化

    全新Syncron融合平臺(tái)助力Karmak客戶(hù)實(shí)現(xiàn)最大限度地優(yōu)化配件供應(yīng)并提高配件銷(xiāo)售額 伊利諾伊州卡林維爾2024年11月2日?/美通社/ -- 重型卡車(chē)運(yùn)輸行業(yè)企業(yè)管理解決方案領(lǐng)先企業(yè)
    的頭像 發(fā)表于 11-03 11:48 ?187次閱讀

    D存器的基本實(shí)現(xiàn)

    在Verilog HDL中實(shí)現(xiàn)存器(Latch)通常涉及對(duì)硬件描述語(yǔ)言的基本理解,特別是關(guān)于信號(hào)如何根據(jù)控制信號(hào)的變化而保持或更新其值。存器與觸發(fā)器(Flip-Flop)的主要區(qū)別在于,
    的頭像 發(fā)表于 08-30 10:45 ?921次閱讀

    d存器解決了sr存器的什么問(wèn)題

    D存器(Data Latch)和SR存器(Set-Reset Latch)是數(shù)字電路中常見(jiàn)的兩種存儲(chǔ)元件。它們?cè)跀?shù)字系統(tǒng)中扮演著重要的角色,用于存儲(chǔ)和傳遞信息。然而,這兩種存器在
    的頭像 發(fā)表于 08-28 09:16 ?658次閱讀

    半自動(dòng)和全自動(dòng)智能的功放,電源設(shè)計(jì)方案

    智能電源功放設(shè)計(jì)需考慮電池類(lèi)型、電壓、功耗、成本及可靠性。本文探討了半自動(dòng)與全自動(dòng)智能鎖在不同電源配置下的設(shè)計(jì)方案,包括IC選型,以提升的性能與安全性,延長(zhǎng)使用壽命。
    的頭像 發(fā)表于 08-21 16:00 ?1632次閱讀
    半自動(dòng)和全自動(dòng)智能<b class='flag-5'>鎖</b>的功放,電源設(shè)計(jì)<b class='flag-5'>方案</b>

    存器工作時(shí)是什么觸發(fā)方式

    存器(Latch)是一種存儲(chǔ)電路,用于存儲(chǔ)一位二進(jìn)制信息。存器在數(shù)字電路設(shè)計(jì)中非常常見(jiàn),它可以用來(lái)保持?jǐn)?shù)據(jù)狀態(tài)、實(shí)現(xiàn)同步等功能。存器的
    的頭像 發(fā)表于 07-23 10:17 ?509次閱讀

    互斥和自旋實(shí)現(xiàn)原理

    保護(hù)共享資源不被多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)。它的實(shí)現(xiàn)原理主要包括以下幾個(gè)方面: 1. 的初始化 互斥鎖在創(chuàng)建時(shí)需要進(jìn)行初始化,通常包括設(shè)置的狀態(tài)為“未鎖定”。在某些實(shí)現(xiàn)中,還需要初始化
    的頭像 發(fā)表于 07-10 10:07 ?576次閱讀

    自旋和互斥的使用場(chǎng)景是什么

    自旋和互斥是兩種常見(jiàn)的同步機(jī)制,它們?cè)诙嗑€(xiàn)程編程中被廣泛使用。在本文中,我們將介紹自旋和互斥的使用場(chǎng)景,以及它們?cè)诓煌瑘?chǎng)景下的優(yōu)勢(shì)和
    的頭像 發(fā)表于 07-10 10:05 ?1087次閱讀

    共享單車(chē)智能方案設(shè)計(jì)【硬件拆解】

    我們經(jīng)常騎的共享單車(chē)到底是什么通信原理,有人了解過(guò)嗎?下面寶藍(lán)小編就帶大家了解下。 一、智能車(chē) 共享單車(chē)最核心的硬件是智能車(chē),主要用于實(shí)現(xiàn)控制和定位功能。 車(chē)內(nèi)集成了嵌入式芯片(
    的頭像 發(fā)表于 03-28 18:19 ?2500次閱讀
    共享單車(chē)智能<b class='flag-5'>鎖</b><b class='flag-5'>方案</b>設(shè)計(jì)【硬件拆解】

    14鍵觸摸觸控芯片-智能感應(yīng)密碼解決方案

    觸控芯片,探討其在解決方案中的作用和優(yōu)勢(shì)。 在智能感應(yīng)密碼的核心技術(shù)中,觸摸觸控芯片可實(shí)現(xiàn)密碼輸入、指紋識(shí)別、聲音識(shí)別等多種功能,為用戶(hù)提供更加便捷和安全的使用體驗(yàn);用戶(hù)只需在芯片上輕觸相應(yīng)的按鍵,即可輸入密
    的頭像 發(fā)表于 03-18 10:17 ?833次閱讀
    14鍵觸摸觸控芯片-智能感應(yīng)密碼<b class='flag-5'>鎖</b>解決<b class='flag-5'>方案</b>

    PLC的點(diǎn)動(dòng)與自設(shè)計(jì)功能實(shí)現(xiàn)

    我們通過(guò)加裝一個(gè)中間繼電器M0.0來(lái)實(shí)現(xiàn)與點(diǎn)動(dòng)功能。
    的頭像 發(fā)表于 03-11 14:06 ?1509次閱讀
    PLC的點(diǎn)動(dòng)與自<b class='flag-5'>鎖</b>設(shè)計(jì)功能<b class='flag-5'>實(shí)現(xiàn)</b>
    主站蜘蛛池模板: 九九影院午夜理论片无码 | 少妇伦子伦精品无码 | 四虎影视永久无码精品 | 久久综合中文字幕佐佐木希 | 欧美一级黄色影院 | 丫鬟粗大狠狠贯穿h | 在线视频 日韩视频二区 | ae58老司机福利 | 亚洲成AV人电影在线观看 | 热九九99香蕉精品品 | 大香伊人久久 | 国产伦精品一区二区三区 | 国产精品嫩草免费视频 | 夜色88V精品国产亚洲AV | 国产a视频视卡在线 | 国模玲玲自拍337p | 久久99AV无色码人妻蜜柚 | 涩涩视频在线看 | 91精品国产91热久久p | 亚洲AV精品无码喷水直播间 | qvod在线电影 | 国产亚洲精品久久久久苍井松 | 首页 国产 亚洲 中文字幕 | 91免费精品国自产拍在线可以看 | AV无码九九久久 | 网红主播 国产精品 开放90后 | 一二三区乱码不卡手机版 | 韩剧甜性涩爱 | 国产又粗又黄又爽的大片 | 免费观看高清黄页网址大全 | 香蕉 在线播放 | 日本漫画大全无翼乌 | 国产精品资源在线观看网站 | 亚洲三级视频在线 | 国产电影午夜成年免费视频 | 狠狠综合久久综合88亚洲 | 91精品国产品国语在线不卡 | 99久久国内精品成人免费 | 久久精品视频在线直播6 | 久久久久综合一本久道 | 国产呻吟久久久久久久92 |