0

可能重复:
.net 中的交易

我只是想了解使用 c# 语言在 .net 中的事务。我在网上浏览了不同的文章。但是,我从理论上了解了交易,但我想实时了解它的确切用途。例如,我应该在什么时候实时使用事务。假设,我正在编写代码,我正在对链接的点击事件执行一些操作。可以说,我正在点击 SQL 连接以获取一些值。我应该在那里使用交易吗?如果我正在编写简单的代码,在不使用 sql 连接的情况下获取值,我应该在那里使用事务吗?使用 Transactions 的优缺点是什么。获得理论知识是不同的,但我想知道它的确切用途。什么时候用什么时候不用。可以在简单代码中使用事务吗?欢迎任何关于交易的基本内容的回复或链接。

4

6 回答 6

3

我正在点击 SQL 连接以获取一些值。我应该在那里使用交易吗?

不,当您不更改数据库中的数据时,不需要使用事务。

使用 Transactions 的优缺点是什么。

正如您所说,您已经学习了各种文章,所以您可能已经弄清楚使用交易的原因。关注数据库中的所有这些。

三层应用程序在创建可扩展和健壮的应用程序方面的优势通过事务处理系统变得可行。能够在不同的服务器之间分发组成应用程序的组件,而无需明确地为该架构进行开发,这是事务服务器处理的另一个优势。事务处理系统还确保事务是原子的、一致的、隔离的和持久的。这使开发人员不必显式地支持这些特性。

为什么我们需要事务处理?
事务处理的优势  

可以在简单代码中使用事务吗?

是的,您可以使用 ADO.Net 在 C# 中简单地编写代码。(例如 SQLTransaction 类)

例如

SqlConnection db = new SqlConnection("connstringhere");
      SqlTransaction transaction;

      db.Open();
      transaction = db.BeginTransaction();
      try 
      {
         new SqlCommand("INSERT INTO TransactionDemo " +
            "(Text) VALUES ('Row1');", db, transaction)
            .ExecuteNonQuery();
         new SqlCommand("INSERT INTO TransactionDemo " +
            "(Text) VALUES ('Row2');", db, transaction)
            .ExecuteNonQuery();
         new SqlCommand("INSERT INTO CrashMeNow VALUES " +
            "('Die', 'Die', 'Die');", db, transaction)
            .ExecuteNonQuery();
         transaction.Commit();

参考:
使用 ADO.NET
.NET 2.0 事务模型执行事务

于 2012-11-07T11:06:57.033 回答
0

参考这篇文章:

http://www.codeproject.com/Articles/10223/Using-Transactions-in-ADO-NET

这将回答您有关交易的问题。

于 2012-11-07T11:04:22.870 回答
0

如果您对使用 Transactions 很认真,您还可以阅读一些关于TransactionScope.NET 中的类的文章。以这种方式实现事务非常简单。

http://simpleverse.wordpress.com/2008/08/05/using-transactionscope-for-handling-transactions/

例子:

using ( var transaction = new TransactionScope() )
{
     // My Database Operations. It doesn't matter what database Type

     transaction.Complete();
}
于 2012-11-07T11:11:32.410 回答
0

事务的本质是确保代表单个进程的一个或多个更改到达数据库一次,如果其中一个失败,其他的应该被撤消。如果您将资金从一个银行账户转移到另一个银行账户,则从一个账户扣款和存入另一个账户必须完全成功。否则,钱会在运输途中丢失

using(SqlConnection conn = new SqlConnection())
{
   try
   {
    conn.Open();
    SqlTransaction tran = conn.BeginTransaction();

    //command to remove from account A
    //command to deposit into account B

    tran.Commit(); //both are successful
   }
   catch(Exception ex)
   {
      //if error occurred, reverse all actions. By this, your data consistent and correct
      tran.Rollback();
   }
}

另一种选择是TransactionScopeSystem.Transactions

于 2012-11-07T11:14:44.013 回答
0

一般来说,正如大多数人所建议的那样,您可能应该使用TransactionScope,尽管这确实有一些需要注意的地方。

using(TransactionScope ts = TransactionUtils.CreateTransactionScope()){
  using(SqlConnection conn = new SqlConnection(connString)){
    conn.Open();
    using(SqlCommand cmd = new SqlCommand("DELETE FROM tableName WHERE somethingorother", conn)){
    cmd....

    }
    using(SqlCommand cmd ....) ...
    thingy.Save();//uses another command/connection possibly
   }

//all above Sql Calls will be done at this point. all or nothing
  ts.Complete();
}

根据它的使用方式(以及您使用的数据库/版本),TransactionScope可能会将事务升级到 MSDTC,这需要在运行应用程序的机器上进行设置(运行提示中的 dcomcnfg)。(TransactionScope 在某些机器上自动升级为 MSDTC?

也值得一读这个 http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx 而不是空白地使用新的 TransactionScope() -那篇文章建议制作一种静态方法来生成具有一些更有用的默认值的方法。

public class TransactionUtils {
  public static TransactionScope CreateTransactionScope()
  {
    var transactionOptions = new TransactionOptions();
    transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
    transactionOptions.Timeout = TransactionManager.MaximumTimeout;
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
  }
}

hth

于 2012-11-07T11:30:08.207 回答
0

我可以告诉你,使用事务取决于业务规则。

从技术上讲,只有在系统上修改数据(更新、删除、插入)时才可以使用事务。当您只是从源获取值并且您 100% 确定没有数据被修改/生成时,请不要将此步骤包含在您的事务中。

为简单起见,如果您对以下任何一种情况回答“是”,请使用事务:

a) 在您的点击中影响多个表格。

b) 在您的点击中影响多个系统。这包括位于不同服务器中的数据库,即使您在同一服务器中有两个不同的实例,它也算作不同的系统。Web 服务调用也算作另一个系统。

c) 有这样的场景:“执行步骤 a,执行步骤 b,如果一切正常,则返回 OK,否则恢复步骤 b,恢复步骤 a,然后返回错误”。

现在如何在现实世界中使用交易。好吧,如果您在模型中只使用一个数据库,那么请使用 ADO.NET 事务模型。 http://adotutorial.blogspot.de/2008/11/transaction-management-in-adonet.html

但是,如果您在同一台服务器中调用不同的数据库实例,或者您正在混合使用不同的技术(SQL、Oracle、Web 服务),那么事务管理的痛苦将增加 1000 倍。然后你需要使用事务范围使它更简单一点。在 .NET 2.0 的 C# 中,您有 TransactionScope。这是您可以告诉运行时帮助我们管理事务的方式。

检查本教程,它可能会有所帮助。 http://codingcramp.blogspot.de/2009/06/how-to-setup-and-use-transactionscope.html

如果您使用的是 microsoft 技术并且在同一台计算机上工作,那么您的代码将运行良好。但是,如果您在网络环境中运行,或者如果您正在混合不同的供应商,那么另一个关键组件进入了这个游戏,它被称为“事务监视器”。如果是这种情况,那么您可能需要检查您的环境中是否启用了 Microsoft DTC,因为它将是用于协调事务的默认选择。

于 2012-11-07T12:17:12.823 回答