リモートでMySQLのTableをLockする方法について
お世話になります。
リモートでMySQLのTableをLockする方法でスタックしてしまい、ここで質問させていただきます。
現在、MySQLのテーブルをリモートから編集できるようなscriptを作成しております。
複数のマシーンから同時にそのテーブルにアクセスするのを防ぐために、「Lock」と「Unlock」を使うことにしました。
以下簡単ですが、使ったコマンドです。
>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;
のようにしました。
上記のコマンドをMySQLに(localから)直接ログインした状態では、うまく動いていることを確認できました。
そこで、上記のコマンドをgo言語を使って、リモートからログインした状態で動かすようなscriptを書きました。
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)
}
問題は、このscriptを動かしますと、第2のcommand文("ここが問題の箇所です")の箇所でプログラムが止まってしまいます。
考えられる原因としては,
第1文("lock table MovieIDs write;")と第2文ではアクセスが別ものと認識されて、第1文でLockされているtableには第2文からアクセス不可だと思っております。
質問ですが、この問題を回避できるような方法はありますでしょうか?
ご教授をお願いします。
よろしくお願いします。