EnTerpriseServices类库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
namespace 隔离级别
{
class Program
{
static void Main(string[] args)
{
var options = new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TimeSpan.FromSeconds(90)
};
using (var scope=new TransactionScope(TransactionScopeOption.Required,options))
{
}
}
}
}
SqlTransaction
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 事务处理
{
class Program
{
static void Main(string[] args)
{
}
public class StudentData {
public async Task AddStudentAsync(Student student) {
var connection = new SqlConnection("");
await connection.OpenAsync();
SqlTransaction tx = connection.BeginTransaction();
try
{
SqlCommand command = connection.CreateCommand();
command.Transaction = tx;
command.CommandText = "insert into students " +
"(FirstName,LastName,Company) values " +
"(@FirstName,@LastName,@Company)";
command.Parameters.AddWithValue("@FirstName", student.FirstName);
command.Parameters.AddWithValue("@LastName", student.LastName);
command.Parameters.AddWithValue("@Company", student.Company);
await command.ExecuteNonQueryAsync();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
finally {
connection.Close();
}
}
}
}
[Serializable]
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
public int Id { get; set; }
public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
}
}
Transactions类库
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
namespace Transactions类库
{
class Program
{
static void Main(string[] args)
{
TransactionFun transactionFun = new TransactionFun();
transactionFun.CommittableTransactionAsync();
#region 事务的升级
#endregion
#region 依赖事务
TransactionFun.DependentTransaction();
#endregion
}
}
public static class Utilities
{
public static bool AbortTx()
{
Console.Write("Abort the Transaction (y/n)?");
return Console.ReadLine().ToLower().Equals("y");
}
public static void DisplayTransactionInformation(string title,
TransactionInformation ti)
{
Contract.Requires<ArgumentNullException>(ti != null);
Console.WriteLine(title);
Console.WriteLine("Creation time :{0:T}", ti.CreationTime);
Console.WriteLine("Status:{0}", ti.Status);
Console.WriteLine("Local ID:{0}", ti.LocalIdentifier);
Console.WriteLine("Distributed ID:{0}", ti.DistributedIdentifier);
Console.WriteLine();
}
}
public class TransactionFun
{
public async Task AddStudentAsync(Student student, Transaction tx)
{
Contract.Requires<ArgumentNullException>(student != null);
var connection = new SqlConnection("");
await connection.OpenAsync();
try
{
if (tx != null)
{
connection.EnlistTransaction(tx);
SqlCommand command = connection.CreateCommand();
command.CommandText = "";
command.Parameters.AddWithValue("@FirstName", student.FirstName);
await command.ExecuteNonQueryAsync();
}
}
catch (Exception)
{
throw;
}
finally
{
connection.Close();
}
}
public async Task CommittableTransactionAsync()
{
var tx = new CommittableTransaction();
Utilities.DisplayTransactionInformation("TX created", tx.TransactionInformation);
try
{
var s1 = new Student { };
await AddStudentAsync(s1, tx);
if (Utilities.AbortTx())
{
}
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
Utilities.DisplayTransactionInformation("TX completed", tx.TransactionInformation);
}
static void TxTask(object obj) {
var tx= obj as DependentTransaction;
Utilities.DisplayTransactionInformation("Dependent Transaction", tx.TransactionInformation);
Thread.Sleep(3000);
tx.Complete();
Utilities.DisplayTransactionInformation("Dependent TX Complete", tx.TransactionInformation);
}
public static void DependentTransaction() {
var tx = new CommittableTransaction();
Utilities.DisplayTransactionInformation("Root tx created", tx.TransactionInformation);
Task.Factory.StartNew(TxTask, tx.DependentClone(DependentCloneOption.BlockCommitUntilComplete));
try
{
if (Utilities.AbortTx())
{
}
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
Utilities.DisplayTransactionInformation("tx finished", tx.TransactionInformation);
}
}
[Serializable]
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
public int Id { get; set; }
public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
}
}
隔离级别
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
namespace 隔离级别
{
class Program
{
static void Main(string[] args)
{
var options = new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TimeSpan.FromSeconds(90)
};
using (var scope=new TransactionScope(TransactionScopeOption.Required,options))
{
}
}
}
}
环境事务
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
namespace 环境事务
{
class Program
{
static void Main(string[] args)
{
txFunc.TransactionScopeAsync();
#region 嵌套的作用域和环境事务
using (var scope = new TransactionScope())
{
Transaction.Current.TransactionCompleted += txFunc.OnTransactionCompleted;
Utilities.DisplayTransactionInformation("Ambient TX created",
Transaction.Current.TransactionInformation);
using (var scope2 = new TransactionScope(TransactionScopeOption.RequiresNew))
{
Transaction.Current.TransactionCompleted += txFunc.OnTransactionCompleted;
Utilities.DisplayTransactionInformation("Inner transaction Scope",
Transaction.Current.TransactionInformation);
scope2.Complete();
}
scope.Complete();
}
#endregion
}
}
public static class Utilities
{
public static bool AbortTx()
{
Console.Write("Abort the Transaction (y/n)?");
return Console.ReadLine().ToLower().Equals("y");
}
public static void DisplayTransactionInformation(string title,
TransactionInformation ti)
{
System.Diagnostics.Contracts.Contract.Requires<ArgumentNullException>(ti != null);
Console.WriteLine(title);
Console.WriteLine("Creation time :{0:T}", ti.CreationTime);
Console.WriteLine("Status:{0}", ti.Status);
Console.WriteLine("Local ID:{0}", ti.LocalIdentifier);
Console.WriteLine("Distributed ID:{0}", ti.DistributedIdentifier);
Console.WriteLine();
}
}
public class txFunc
{
public static async Task TransactionScopeAsync()
{
using (var scope = new TransactionScope())
{
Transaction.Current.TransactionCompleted += OnTransactionCompleted;
Utilities.DisplayTransactionInformation("Ambient TX created",
Transaction.Current.TransactionInformation);
var s1 = new Student
{
FirstName = "Angela",
LastName = "Nagel",
Company = "Kantine M101"
};
var db = new StudentData();
await db.AddStudentAsync(s1);
if (!Utilities.AbortTx())
scope.Complete();
else
Console.WriteLine("transaction will be aborted");
}
}
public static void OnTransactionCompleted(object sender, TransactionEventArgs e)
{
Utilities.DisplayTransactionInformation("", e.Transaction.TransactionInformation);
}
}
public class StudentData
{
public async Task AddStudentAsync(Student student)
{
var connection = new SqlConnection("");
await connection.OpenAsync();
SqlTransaction tx = connection.BeginTransaction();
try
{
SqlCommand command = connection.CreateCommand();
command.Transaction = tx;
command.CommandText = "insert into students " +
"(FirstName,LastName,Company) values " +
"(@FirstName,@LastName,@Company)";
command.Parameters.AddWithValue("@FirstName", student.FirstName);
command.Parameters.AddWithValue("@LastName", student.LastName);
command.Parameters.AddWithValue("@Company", student.Company);
await command.ExecuteNonQueryAsync();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
finally
{
connection.Close();
}
}
}
[Serializable]
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
public int Id { get; set; }
public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
}
}