2011-01-22 6 views
1

私はいくつかのスレッドを持つ並列bashスクリプトを持っています。各スレッドはレコードが存在するかどうかをチェックし、それ以外の場合は新しい値を挿入します。 スレッドの並行性について気にする必要がありますか? ロック解除テーブルをロックするか、mysqlがそれを気にする必要がありますか?MySQL(MyISAM)テーブルを並行して更新するには?

私の更新は、コマンドライン上で行く:

#get.sh script... 
# set status Downloading 
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 1)" 
rsync -ar rsync://[email protected]/$2/ $1/$2/ 
if [ $? -eq 0 ]; 
then 
# set status OK 
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 0)" 
else 
# set status ERROR 
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 2)" 
fi 

私は、異なるパラメータを持つ複数のget.sh呼び出します。


ありがとうございました
アルマン。

答えて

2

ロックを実装することはできますが、それは複数のスレッドを持つ目的を無効にします。 MyISAMはテーブルレベルのロックしかサポートしていないので、一度に1つのスレッドしかテーブルを変更することができません。

可能であれば、フィールドに一意のインデックスまたは主キーを配置します。 INSERT ... DUPLICATE KEY UPDATE ...を実行すると、MySqlはアクションがアトミックであることを確認します。

私が通常マルチスレッド/処理で行うことは、実行する必要があるすべてのジョブの「リスト」を最初のスレッド/プロセスが持っていて、スレッド/フォークを作成して各ジョブまたはジョブ。親スレッド/プロセスは、子どもが同じことをしようとしていないことを保証します。私はあなたの場合にこれが動作するかどうかは分かりません。

+0

ありがとうございました、私はスレッドごとに一意のレコードを書いたり更新したりしています。たとえば、スレッド1は1から始まるファイルのみを管理します。スレッド2はファイル2を返します。テーブルは危険ではないですか? – Arman

+0

いいえ、データベースは競合の問題を処理します。それがデータベースの役割です。挿入、更新、または削除は、必要なロックを自動的に実行します。 –

関連する問題