トランザクション
CacheTransaction を使用すると、トランザクションでデータベース操作をラップできます。CacheTransaction は、BeginTransaction、Commit、および Rollback の各メソッドをサポートしており、これらはそれぞれトランザクションの開始、コミット、ロールバックを実行します。
以下のコードでは、InsertContact を 2 回呼び出しています。これは、1 つのトランザクションで 2 つの呼出しをラップし、この 1 組みの挿入がアトミックな操作となるようにしています。いずれか一方の操作で例外が返された場合は、両方の挿入がロールバックされます。
CacheTransaction trans = null;
try
{
CacheConnection cnCache = new CacheConnection(conStr);
cnCache.Open();
trans = cnCache.BeginTransaction();
InsertContact(cnCache, trans, "Smith,Fred", "Personal");
InsertContact(cnCache, trans, "Smith,Linda", "Busines");
trans.Commit();
}
catch(Exception e)
{
trans.Rollback();
Console.WriteLine("Exception: {0}", e.Message);
}
上記のコードで呼び出された InsertContact メソッドを次に示します。ここで、CacheCommand コンストラクタは、CacheTransaction インスタンスを引数として取ります。
public int InsertContact(CacheConnection cnCache, CacheTransaction trans,
string name, string type)
{
string sql = "Insert into Provider.Contact(Name,ContactType) Values(?,?)";
CacheCommand command = new CacheCommand(sql, cnCache, trans);
CacheParameter name_param = new CacheParameter();
name_param.CacheDbType = CacheDbType.NVarChar;
name_param.ParameterName = "Name";
name_param.Direction = ParameterDirection.Input;
name_param.Value = name;
CacheParameter type_param = new CacheParameter();
type_param.CacheDbType = CacheDbType.NVarChar;
type_param.ParameterName = "ContactType";
type_param.Direction = ParameterDirection.Input;
type_param.Value = type;
command.Parameters.Add(name_param);
command.Parameters.Add(type_param);
int rows = command.ExecuteNonQuery();
return rows;
}