【发布时间】:2014-01-22 14:11:21
【问题描述】:
假设我们有以下自定义 DbManager(它拥有的唯一私有成员是 string connectionString):
public class SqlServerManager : DbManager
{
public SqlServerManager(string connectionString)
: base(connectionString) { }
public override System.Data.DataTable GetDataTableFrom(string query, string tableName)
{
DataTable dt = new DataTable(tableName);
if (string.IsNullOrEmpty(query))
return dt;
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
connection.Open();
adapter.Fill(dt);
}
return dt;
}
public override object GetObjectFrom(string query)
{
return GetObjectFrom(query, 0);
}
public object GetObjectFrom(string query, int commandTimeout)
{
object result = null;
if (!string.IsNullOrEmpty(query))
{
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
SqlCommand command = new SqlCommand(query, connection);
command.CommandTimeout = commandTimeout;
command.Connection.Open();
result = command.ExecuteScalar();
}
}
return result;
}
public override void ExecuteNonQuery(string query)
{
ExecuteNonQuery(query, (SqlTransaction)null);
}
public void ExecuteNonQuery(string query, System.Data.SqlClient.SqlTransaction transaction)
{
if (!string.IsNullOrEmpty(query))
{
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
SqlCommand command = new SqlCommand(query, connection, transaction);
command.Connection.Open();
command.ExecuteNonQuery();
}
}
}
}
a) 如何在此处添加一些事务支持?
比如说,使用共享事务(null 或 any)和一对Begin\Rollback\Commit\Transaction()?
假设我们没有复杂的情况,同一时间只有一个事务由我们的类维护。
b) 使用这样的东西可能会更好(在示例中是类似的,但 DB2Manager):
using (TransactionScope scope = new TransactionScope())
{
// first connection Created/Disposed
myDb2Manager.ExecuteNonQuery(mySql_1);
// second connection Created/Disposed
myDb2Manager.ExecuteNonQuery(mySql_2);
// 3rd connection Created/Disposed
myDb2Manager.ExecuteNonQuery(mySql_3);
// commit everything
scope.Complete();
}
【问题讨论】:
标签: c# .net transactions ado.net .net-3.5