中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

編碼過程中,需要注意的地方

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用


記得之前寫游戲玩家類的時(shí)候,對(duì)于玩家數(shù)據(jù)的修改,我們總是提供這樣的接口。比如是對(duì)玩家金錢的修改。

public Player
{ private int money = 0; public void addMoney(int money) { this.money = this.money + money;
  } public void deductMoney(int money) { this.money = this.money - money;
  } public int getMoney() { return this.money;
  }
}

而避免提供這樣的接口

public Player
{ private int money = 0; public void setMoney(int money) { this.money = money;
  } public int getMoney() { return this.money;
  }
}

后者,我們每次操作玩家金錢的時(shí)候,總是需要先getMoney,然后再添加或者刪除,最后再調(diào)用setMoney方法。這樣方式,有兩個(gè)比較大的缺點(diǎn)。1:操作繁瑣。 2:如果是多線程,將無法控制,在getMonet 和 setMoney,之間如果其他線程操作玩家Money,那么將要出現(xiàn)數(shù)據(jù)不一致的情況。 而前者避免了這兩種情況。但是沒有想到這個(gè)典型的錯(cuò)誤,在應(yīng)用代碼中也是經(jīng)常出現(xiàn)。于是就發(fā)現(xiàn)了下面的問題。

最近在工程中發(fā)現(xiàn)了N多這樣的代碼!

Member member = memberMapper.selectMemberById(id); int money = xxx;
member.setMoney(member.getMoney() + money);
memberMapper.updateMemberSelective(member);

這個(gè)問題和上面的提供set get的方式一樣。不過數(shù)據(jù)放到了數(shù)據(jù)庫中而已。

問題除了那兩個(gè)問題,還多了一個(gè)。
第一:操作繁瑣,每次都是先從數(shù)據(jù)庫select,然后再去計(jì)算新的值,最后再去數(shù)據(jù)庫update。
第二:數(shù)據(jù)庫不一致,如果在select和update之間,其他線程操作這個(gè)玩家的money,那么肯定會(huì)出現(xiàn)不一直的情況。
第三:兩次數(shù)據(jù)庫的操作,慢,卡!

所以正確的寫法應(yīng)該是:

int memberId = xxxx; int money = xxxx;
memberMapper.addMemberMoney(memberId,money);

addMemberMoney實(shí)現(xiàn):

update set membermoney = membermoney + money where id = memberid;

這里雖說多提供了sql語句,但是于邏輯,于數(shù)據(jù)一致性方面,都有了很大的提升。


文/archy_yu(簡(jiǎn)書作者)
原文鏈接:http://www.jianshu.com/p/d1c74c034ac7


標(biāo)簽: 代碼 數(shù)據(jù)庫

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:淺談iOS的文件操作

下一篇:iOS開發(fā)探索-正則表達(dá)式