大家好,又見面了,我是你們的朋友全棧君。 當隻是使用一次事務時,隻用簡單的事務就可以了
示例代碼:
SqlServerDataBase obj = new SqlServerDataBase();
SqlConnection conn = obj.DBconn();
conn.Open();
SqlTransaction myTrans;
myTrans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
obj.Insert(“insert into StuInfo (StuNumber,Name,Sex,Specialty) values(‘” + stuNumber + “‘,'” + name + “‘,'” + sex + “‘,'” + specialty + “‘)”, null);
obj.Insert(“insert into StuSkill(StuNumber,Skill) values(‘” + stuNumber + “‘,'” + skill + “‘)”, null);
myTrans.Commit();
Response.Write(“兩條資料均插入到資料庫中!”);
}
catch (Exception ex)
{
try
{
myTrans.Rollback();
}
catch (SqlException sqlEx)
{
if (obj.DBconn() != null)
{
Response.Write(sqlEx.GetType()+”資料庫打開失敗”);
Response.Redirect(“submit.htm”);
}
}
}
finally
{
obj.DBconn().Close();
}
但是設計多個事務處理,比方使用for循環時,處理不當就會産生“SqlTransaction 已完成;它再也無法使用”的問題,主要就是因為SqlTransaction 使用了Commit()後就是不能在使用了,必須重新BeginTransaction()一個。
批處理事務不應該把transaction事務放在for循環裡,造成多個事務,這将導緻錯誤.
應該把for放在transaction裡,當成一個事務來處理,進行批處理
示例代碼:
protected void btnDelete_Click(object sender, EventArgs e) //删除
{
SqlServerDataBase del = new SqlServerDataBase();
string str = “”;
SqlConnection conn = del.DBconn();
conn.Open();
SqlTransaction myTrans;
myTrans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
ListBox1.Items.Clear();
try
{
for (int i = 0; i < GridView1.Rows.Count; i++) //從GridView中選中checkbox
{
GridViewRow row = GridView1.Rows[i];
bool isChecked = ((CheckBox)row.FindControl(“chkSelect”)).Checked;
if (isChecked)
{
ListBox1.Items.Add(GridView1.Rows[i].Cells[2].Text);
//Column 1 is the StuNumber column
str = GridView1.Rows[i].Cells[1].Text; //擷取删除行的StuNumber的值
// Response.Write(str.ToString());
del.Delete(“delete from StuInfo where StuNumber = ‘” + str + “‘”, null);
del.Delete(“delete from StuSkill where StuNumber = ‘” + str + “‘”, null);//删除
}
}
myTrans.Commit();
}
catch (Exception ex)
{
try
{
myTrans.Rollback();
}
catch (SqlException sqlEx)
{
if (del.DBconn() != null)
{
Response.Write(sqlEx.GetType() + “資料庫打開失敗”);
Response.Redirect(“submit.htm”);
}
}
}
finally
{
conn.Close();
}
BindData();
}
}
注意:兩者在使用上是有差別的!
另外在windows服務中,
windows的服務服務正常運作一段時間後,在ontimer中就無法再啟動了,提示:此SqlTransaction已完成;它再也無法使用。
有可能是 timer 時間間隔 太短,造成事務太頻繁!
也可能是Transaction兩次送出的原因,需要注意一下timer的啟用時機。
參考網站:
C#事務的使用、示例及注意事項
http://blog.csdn.net/kiki113/archive/2007/04/29/1591999.aspx
http://topic.csdn.net/u/20070830/10/62719c5d-cb7a-47e5-87a3-89077d82dc77.html
釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/143857.html原文連結:https://javaforall.cn