むかしむかし、どのようにエキサイティングな半日業務執行。
昔、彼が得意な取引を書きました!
string connStr=@"Data Source=.\sqlexpress;Initial Catalog=DbTest;Integrated Security=True";
using(SqlConnection conn=new SqlConnection(connStr))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
SqlCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;
try
{
//操作1
cmd.CommandText = "insert into test1(id) values('aa')";
cmd.ExecuteNonQuery();
//操作2
cmd.CommandText = "insert into test1(id) values('01234567890')";//该句出错,id类型为varchar(10)
cmd.ExecuteNonQuery();
trans.Commit();
Console.WriteLine("提交!!");
}
catch(Exception e)
{
Console.WriteLine(e.Message);
trans.Rollback();
Console.WriteLine("回滚!!");
}
}
Console.ReadLine();
}
附上只有一个字段的Test1表:
ID varchar(10) 主键
而后,又发现了Linq to Sql 这个好东西,它是一个轻量级级的ORM,功能非常强大,而且自带事务集成功能。简单的Linq参考资料
我们同样操作上面一个过程,使用Linq如下
1.新建一个 Linq to Sql 类,命名为DataClasses1.dbml,再通过‘服务器资源管理器’ 把数据库中的表添加到设计画面。
2.事务操作如下。
DataClasses1DataContext db = new DataClasses1DataContext();
try
{
//插入一条ID=1的Test1 的实体。
db.Test1.InsertOnSubmit(new Test1() { ID = "1" });
//插入一条超出限定长度的数据,让它报错
db.Test1.InsertOnSubmit(new Test1() { ID = "01234567890" });
//提交
db.SubmitChanges();
}
catch { }
もちろん、理由は第2のエラー文の提出の時の、コミットが失敗し、最初の文もロールバックされます。彼は、このような簡単な操作ですが、我々はまた、ORMモデルは、もはや頭痛で、トランザクションを忘れそう元と簡単に記述する必要はありません。それはそれを完璧ではないこと?
実は、私たちは、トランザクションは、それが明確であれば、単にLINQのは解決できない使用し、クロスデータベース操作で、想像することができません。また、LINQのはまだ成熟していない、別のデータベースのために、ブラウザの互換性の問題に似た一貫性のない操作を生成します。しかし、LINQのは本当に強力ですが、それは神の存在には影響を与えません。
最近では、トランザクションはのTransactionScopeクラスを見つけるために持っている、TransactionScopeのは、鏡のようなものです、あなただけの彼に叫ぶ:神は、私にトランザクションを与えます!あなたは本当にビジネスを取得します。
次のように:
using (TransactionScope scope = new TransactionScope())
{
//操作1,数据库1操作
//操作2,数据库2操作
//操作3
scope.Complete();
}
Scope.Completeするための任意の異常動作の前に()、すべての操作は、(それがどのデータベース・サーバーに属しているかどうか)にロールバックされます。
彼はも過言ではありませんミラーであることを、非常に強力!
ます。https://www.cnblogs.com/xinjian/archive/2010/07/09/1774033.htmlで再現