

お世話になります。  
リモートでMySQLのTableをLockする方法でスタックしてしまい、ここで質問させていただきます。

現在、MySQLのテーブルをリモートから編集できるようなscriptを作成しております。  
複数のマシーンから同時にそのテーブルにアクセスするのを防ぐために、「Lock」と「Unlock」を使うことにしました。

以下簡単ですが、使ったコマンドです。

[code]

    >lock table MovieIDs write;
    >select feature1, feature2 from MovieIDs where STATUS = 'setup' and GroupID = '1' ORDER BY RAND() limit 1;
    >update MovieIDs set STATUS = 'process' where STATUS = 'setup' and feature1 = 'test1' and feature2 = 'test1' and GroupID = '1';
    >unlock tables;
    
[/code]

のようにしました。  
上記のコマンドをMySQLに(localから)直接ログインした状態では、うまく動いていることを確認できました。

そこで、上記のコマンドをgo言語を使って、リモートからログインした状態で動かすようなscriptを書きました。

[code]

    package main
    
    import (
            "os"
            "fmt"
    )
    
    import "database/sql"
    import _ "github.com/go-sql-driver/mysql"
    
    func main() {
      db, err := sql.Open("mysql", "usrname:passwrd@tcp(ipaddress)/DBname")
      if err != nil {
        panic(err.Error())
      }
      defer db.Close()
    
      GroupID := "1";
      idx10 := 0;
      for {
            command := "";
    
            command = "lock table MovieIDs write;";
            fmt.Println(command)
            _, _ = db.Query(command)
    
            command = "select feature1, feature2 from MovieIDs where STATUS = 'setup' and GroupID = '"+GroupID+"' ORDER BY RAND() limit 1;";
            fmt.Println(command)   
            rows, _ := db.Query(command)　//<-ここが問題の箇所です
            var feature1, feature2 string;
            for rows.Next() {
                err = rows.Scan(&feature1, &feature2);
            }
            idx10 += 1;
            if avi_name == "" {
                break;
            } else {
                fmt.Println(idx10, feature1, feature2);
            }
    
            command = "update MovieIDs set STATUS = 'process' where STATUS = 'setup' and feature1= '"+feature1+"' and feature2= '"+feature2+"' and GroupID = '"+GroupID+"';";
            fmt.Println(command)
            _, _ = db.Query(command);
    
            command = "unlock tables;"
            fmt.Println(command)
            _, _ = db.Query(command)
        }
    
        os.Exit(1)
    }
    
[/code]

問題は、このscriptを動かしますと、第２のcommand文("ここが問題の箇所です")の箇所でプログラムが止まってしまいます。

考えられる原因としては,  
第１文("lock table MovieIDs
write;")と第２文ではアクセスが別ものと認識されて、第１文でLockされているtableには第２文からアクセス不可だと思っております。

質問ですが、この問題を回避できるような方法はありますでしょうか？

ご教授をお願いします。  
よろしくお願いします。


CC BY-SA 3.0
2018-03-31T01:37:10.557
42813
2018-03-31T01:37:10.557
11048
question
mysql go
リモートでMySQLのTableをLockする方法について