• TransactionScope和Enterprise Libray 3.0 Data Access Application Block


    Enterprise Libray 3.0已经发布了,具体可参见TerryLeeEnterprise Library 3.0 发布.下载了看看,有非常激动人心的更新.我只是看看Data Access Application Block代码,代码中有这个类TransactionScopeConnections,是个内部类,设计意图很明显就是使用数据库的事务模型.我觉得设计为内部类有点瑕疵,我的习惯是事务和提交在业务逻辑层. .NET 2.0的System.Transactions应该是一个更好的选择。就将Data Access Application Block的QuickStart例子代码:

    /// <summary>
    /// Transfers an amount between two accounts.
    /// </summary>
    /// <param name="transactionAmount">Amount to transfer.</param>
    /// <param name="sourceAccount">Account to be credited.</param>
    /// <param name="destinationAccount">Account to be debited.</param>
    /// <returns>true if sucessful; otherwise false.</returns>
    /// <remarks>Demonstrates executing multiple updates within the
    /// context of a transaction.</remarks>
    public bool Transfer(int transactionAmount, int sourceAccount, int destinationAccount)
    {
    bool result = false;

    // Create the Database object, using the default database service. The
    // default database service is determined through configuration.
    Database db = DatabaseFactory.CreateDatabase();

    // Two operations, one to credit an account, and one to debit another
    // account.
    string sqlCommand = "CreditAccount"
    DbCommand creditCommand = db.GetStoredProcCommand(sqlCommand);

    db.AddInParameter(creditCommand, "AccountID", DbType.Int32, sourceAccount);
    db.AddInParameter(creditCommand, "Amount", DbType.Int32, transactionAmount);

    sqlCommand = "DebitAccount"
    DbCommand debitCommand = db.GetStoredProcCommand(sqlCommand);

    db.AddInParameter(debitCommand, "AccountID", DbType.Int32, destinationAccount);
    db.AddInParameter(debitCommand, "Amount", DbType.Int32, transactionAmount);

    using (DbConnection connection = db.CreateConnection())
    {
    connection.Open();
    DbTransaction transaction = connection.BeginTransaction();

    try
    {
    // Credit the first account
    db.ExecuteNonQuery(creditCommand, transaction);
    // Debit the second account
    db.ExecuteNonQuery(debitCommand, transaction);

    // Commit the transaction
    transaction.Commit();

    result = true;
    }
    catch
    {
    // Rollback transaction
    transaction.Rollback();
    }
    connection.Close();

    return result;
    }
    }

    按照TransactionScope类进行改造,试验成功了,代码如下:

    public bool Transfer(int transactionAmount, int sourceAccount, int destinationAccount)
    {
    bool result = false;
    Database database = DatabaseFactory.CreateDatabase();

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
    TestCommand1(database, transactionAmount, sourceAccount);
    TestCommand2(database, transactionAmount, destinationAccount);
    scope.Complete();
    result = true;
    }
    return result;

    }

    private void TestCommand1(Database db, int transactionAmount, int sourceAccount)
    {
    string sqlCommand = "CreditAccount"
    DbCommand creditCommand = db.GetStoredProcCommand(sqlCommand);

    db.AddInParameter(creditCommand, "AccountID", DbType.Int32, sourceAccount);
    db.AddInParameter(creditCommand, "Amount", DbType.Int32, transactionAmount);

    // Credit the first account
    db.ExecuteNonQuery(creditCommand);
    }

    private void TestCommand2(Database db, int transactionAmount, int destinationAccount)
    {
    string sqlCommand = "DebitAccount"
    DbCommand debitCommand = db.GetStoredProcCommand(sqlCommand);

    db.AddInParameter(debitCommand, "AccountID", DbType.Int32, destinationAccount);
    db.AddInParameter(debitCommand, "Amount", DbType.Int32, transactionAmount);

    // Debit the second account
    db.ExecuteNonQuery(debitCommand);
    }

      DAAB  在一个事务中可以在一个数据库连接中检测到几个命令的执行,这样可以避免虽然一个数据库连接执行的几个命令而启用 分布式事务 。在企业类库2.0的DAAB常常启用了分布式事务,就凭这一点,使用企业类库2.0的同学们有必要升级到企业类库3.0。

    Parameter Discovery on Ms Access and SqlServer. using Microsoft Patterns and Practices DataBlock version 3.0 final
    http://www.codeproject.com/useritems/Parameter_DiscoveryV292.asp

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    spring3创建RESTFul Web Service
    安装Maven
    如何使用 JSP JSTL 显示/制作树(tree) 菜单
    Eclipse EE导入maven工程
    安装PL/SQL Developer,链接本地64位Oracle
    Maven项目消除奇怪的红叉
    如何禁用Eclipse的Validating
    帮助文档总览
    MySQL下载安装、配置与使用(win7x64)
    C#知识点总结:Monitor和Lock以及区别
  • 原文地址:https://www.cnblogs.com/shanyou/p/704057.html
Copyright © 2020-2023  润新知