あなたの先生はトランザクションについて言及しています。 MySQL *を含むほとんどのリレーショナルデータベースは、トランザクションをサポートしています。トランザクションにより、複数のCRUD操作のアトミックな動作が可能になります。これは、1つの操作が失敗した場合、データベースは、操作がまったく発生しなかったかのように行われた変更をロールバックすることを意味します。
それらは順次実行されていることに注意してください 、ない 同時に。ただし、これらはアトミックであるため、すべてを1回の操作で実行するのと同じように感じます。
OleDbConnection
C#を使用するクラスでは、接続オブジェクトが開いていると仮定して、接続オブジェクトからトランザクションを作成できます。ただし、ストアドプロシージャとは異なり、トランザクションを手動でコミットまたはロールバックする必要があることに注意してください。
トランザクションをコミットすると、その一連の操作がデータベースに対して「永続的」になります。コミットした後はロールバックできません。
ロールバックとは、データベースをトランザクションを開始する前に存在していた状態にリセットすることです。
以下は、OleDbConnectionオブジェクトからトランザクションを作成し、コミットを実行する例と、ロールバックが必要な2つのケースです。
using(OleDbConnection con = DAL.GetConnection())
{
OleDbTransaction transaction = null;
try
{
con.Open();
transaction = con.BeginTransaction()
string queryString1 = //SQL string
OleDbCommand cmd1 = new OleDbCommand();
{
Connection = con,
CommandType = CommandType.Text,
CommandText = queryString1
};
string queryString2 = //SQL string
OleDbCommand cmd2 = new OleDbCommand();
{
Connection = con,
CommandType = CommandType.Text,
CommandText = queryString2
};
int num1 = cmd.ExecuteNonQuery();
int num2 = cmd.ExecuteNonQuery();
if (num1 == 0 || num2 == 0)
{
//We didn't expect something to return 0, lets roll back
transaction.Rollback();
//send error message
Response.Redirect("register.aspx?err=Error");
}
else
{
//everything seems good, lets commit the transaction!
transaction.Commit();
Session["id"] = MyDB.GetUserId(uname);
Response.Redirect("home.aspx");
}
}
catch(OleDbException ex)
{
try
{
//something bad happened, lets roll everything back
transaction.Rollback();
Response.Redirect("register.aspx?err=Error");
}
catch
{
//we don't really care about this catch statement
}
}
}
OleDbConnection.BeginTransaction
上に投稿したものと同様の一般的な例を使用したメソッド。
編集 :
* @Clockwork-Museがコメントで指摘したように、トランザクションをサポートするMySQLの機能は、使用されている基盤となるエンジンによって異なります。多くのMySQLエンジンがありますが、2つの主要なエンジンはInnoDBとMyISAMです。 InnoDB CAN トランザクションをサポートしますが、MyISAMはしません 。