题
什么是最好的做法来做交易。网2.0.什么类的应用?什么都是陷阱看出来,等等。所有提交和回滚的东西。我刚开始一个项目,我也许需要做某些事务,同时插入数据的数据库。任何反应或链接,用于甚至最基本的东西有关的交易都是值得欢迎的。
解决方案
有2个主要类型的交易;连接的交易和环境交易。一个连接的交易(例如SqlTransaction)在直接联系的数据库连接(例如和),这意味着你要保持经过周围的连接-好的在某些情况下,但不允许"创建/利用/发布"的使用,并且不允许跨数据库的工作。一个例子(格式化的空间):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
不太杂乱,但是仅限于我们连接"conn".如果我们想要打电话给不同的方法,我们现在需要通过"conn"周围。
这种替代是一个环境事务;新。网2.0 TransactionScope 目(System.Transactions.dll)允许使用在一定范围的行动(合适的供应商将自动登记在环境事务)。这使得它很容易回合到现有(非事务)的代码,并谈到多个提供者(虽然DTC会得到所涉及的如果你跟超过一个)。
例如:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
这里注意的两个方法可以处理他们自己的连接(开/利用/关闭/处置),而他们将静静地成为一部分的环境事务没有我们具有通过任何东西。
如果你的代码错误,Dispose()将被称为不完整的(),所以它将被卷回来。预期的筑巢等是支持的,虽然你不能回滚内部事务尚未完成外的交易:如果有人不幸的是,该事务是中止。
其他的优点TransactionScope是,它不是绑只是对数据库;任何交易意识的提供者可以使用它。WCF,例如。或甚至有一些TransactionScope兼容的对象模型(即.净类带回退的功能,也许更容易,比纪念,虽然我从来没有使用这种方法我自己).
所有的一切,一个非常,非常有用的对象。
一些注意事项:
- 在SQL Server2000年,TransactionScope会去DTC立即进行;这是固定在SQL服务器2005年及以上时,它可以使用的伦特制造(多少开销),直到你们谈到2源等,当它被提升到DTC。
- 还有一个 小故障 这意味着你可能需要调整你连字符串
其他提示
protected void Button1_Click(object sender, EventArgs e)
{
using (SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"))
{
connection1.Open();
// Start a local transaction.
SqlTransaction sqlTran = connection1.BeginTransaction();
// Enlist a command in the current transaction.
SqlCommand command = connection1.CreateCommand();
command.Transaction = sqlTran;
try
{
// Execute two separate commands.
command.CommandText =
"insert into [doctor](drname,drspecialization,drday) values ('a','b','c')";
command.ExecuteNonQuery();
command.CommandText =
"insert into [doctor](drname,drspecialization,drday) values ('x','y','z')";
command.ExecuteNonQuery();
// Commit the transaction.
sqlTran.Commit();
Label3.Text = "Both records were written to database.";
}
catch (Exception ex)
{
// Handle the exception if the transaction fails to commit.
Label4.Text = ex.Message;
try
{
// Attempt to roll back the transaction.
sqlTran.Rollback();
}
catch (Exception exRollback)
{
// Throws an InvalidOperationException if the connection
// is closed or the transaction has already been rolled
// back on the server.
Label5.Text = exRollback.Message;
}
}
}
}
你也可以包裹交易进入它自己的存储的过程和处理这种方式而不是做交易C#本身。
如果你只是需要它的数据库有关的东西,一些或映射器(例如它能够)支持transactinos出的框每默认。
它还取决于你需要什么。对于基本SQL交易你可以尝试做TSQL交易通过使用开始反和提交反,在你的代码。这是最简单的方式,但它具有复杂性和你必须要小心提交适当(和rollback).
我会用些东西喜欢
SQLTransaction trans = null;
using(trans = new SqlTransaction)
{
...
Do SQL stuff here passing my trans into my various SQL executers
...
trans.Commit // May not be quite right
}
任何失败都将出你的权利了的 using
和交易将始终提交或rollback(取决于是你告诉它来做)。最大的问题,我们面临的是确保它始终承诺。将使用可以确保范围的交易是有限的。