TransactionScope和Enterprise Libray 3.0 Data Access Application Block
2007-04-07 17:38:00
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://shanyou.blog.51cto.com/363653/74330 |
Enterprise Libray 3.0已经发布了,具体可参见TerryLee的 Enterprise 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 自由、创新、研究、探索…… 本文出自 “张善友” 博客,请务必保留此出处http://shanyou.blog.51cto.com/363653/74330 本文出自 51CTO.COM技术博客 |


张善友
博客统计信息
热门文章
最新评论
友情链接