Upgrade to Pro — share decks privately, control downloads, hide ads and more …

POSレジとGo

Terry
August 11, 2021

 POSレジとGo

2021/08/11に行われたGeekGigの登壇資料です
https://showcase-gig.connpass.com/event/217914/

Terry

August 11, 2021
Tweet

More Decks by Terry

Other Decks in Programming

Transcript

  1. 7 POSレジ • POS ◦ Point Of Sales • 役割

    ◦ 「何を・いつ・いくらで・何個販売したのか」を記録 ◦ 商品のマスタを管理.... • 種類 ◦ パソコン型 ◦ ターミナル型 ◦ タブレット型...
  2. 24 チャネル func categorySync(ch chan struct{}, .....) (err error) {

    defer func() { ch <- struct{}{} } /* カテゴリー同期処理 */ } func menuSync(ch struct{}, .....) (err error) { select { case <-ch: /* メニュー同期処理 */ } }
  3. 27 メニュー同期 func Sync(.....) (err error) { for _, shop

    := range shops { // メニュー同期 go menuSync(ch, ......) } ……. }
  4. 28 マスタ同期 func Sync(.....) (err error) { // カテゴリー同期 go

    categorySync(ch) for _, shop := range shops { // メニュー同期 go menuSync(ch, ......) } ……. }
  5. 35 アトミック(不可分性)でない 同期開始 同期終了 ロック の確認 カテゴリー同期 ロックの取得 メニュー同期 同期開始

    同期終了 ロック の確認 カテゴリー同期 ロックの取得 メニュー同期 リクエストA リクエストB ロックがかかっていない と判断される
  6. 37 不可分性を保つために func changeState(db *sql.DB, from to state, .....) (err

    error) { result, err := db.Exec("UPDATE sync_state SET state = to where state = from and …") affected, err := result.RowsAffected() if affected < 1 { /* 更新行なし = 他のプロセスで変更された */ } } • UPDATEでも不可分性を保つためのコードを利用