単一の MySQL (InnoDB) データベースにアクセスする複数の自動化されたサービス間でデータの一貫性を維持しようとしています。現在、GET_LOCK を使用してこれを達成しようとしています。自動生成された型指定されたデータセットを使用しており、次のクエリを構成しています。
SELECT GET_LOCK('@id', 1)
アダプターはパラメーターとして も受け入れInt32
ます。問題は、'@id'
フィールドが文字列リテラルとして解釈されるため、動的に割り当てられたロック文字列を取得できないことです。私の質問は、これが可能かどうかです。
私の現在の回避策は、次のようなものです。
DataSetTableAdapters.myTableAdapter typedAdapter = new DataSetTableAdapters.myTableAdapter();
MySql.Data.MySqlClient.MySqlCommand selectCommand_backup = typedAdapter.Adapter.SelectCommand;
typedAdapter.Adapter.SelectCommand = new MySql.Data.MySqlClient.MySqlCommand();
typedAdapter.Adapter.SelectCommand.Connection = typedAdapter.Connection;
typedAdapter.Adapter.SelectCommand.CommandText = string.Format("SELECT GET_LOCK('{0}_{1}', 1)", tableName, id);
typedAdapter.Adapter.SelectCommand.CommandType = System.Data.CommandType.Text;
typedAdapter.Connection.Open();
typedAdapter.Adapter.SelectCommand.ExecuteScalar();
typedAdapter.Connection.Close();
typedAdapter.Adapter.SelectCommand = selectCommand_backup;
私は他のアイデアにもオープンです。自動化されたシステムで処理するのは難しいため、可能であれば競合の解決を回避したいと考えています。