在提交事务之前处理分配给事务的命令是否有效?我自己测试了以下代码,它似乎工作得很好,但这是一个相当小的例子,所以我正在寻找是否有人确实知道的确认。
internal static void TestTransaction()
{
try
{
Program.dbConnection.Open();
using (SqlTransaction transaction = Program.dbConnection.BeginTransaction())
{
Boolean doRollback = false;
for (int i = 0; i < 10; i++)
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO [testdb].[dbo].[transactiontest] (testvalcol) VALUES (@index)", Program.dbConnection, transaction))
{
cmd.Parameters.AddWithValue("@index", i);
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException)
{
doRollback = true;
break;
}
}
}
if (doRollback)
transaction.Rollback();
else
transaction.Commit();
}
}
finally
{
Program.dbConnection.Close();
}
}
连接、事务和命令对象只是向数据库发送命令的工具。一旦执行命令,数据库就会收到它。无论您之后对命令对象做什么,处理它,烧毁它,或者将它发射到月球,这个事实都不会改变。 (只能回滚)。
您可以在一个范围内创建和配置任意数量的命令SqlConnection
(有还是没有SqlTransaction
)。您可以在一次交易中启动和处理任意数量的交易SqlConnection
。为了证明这一点,请参阅:
using (var conn = new SqlConnection(@"server=(local)\sql2008;database=Junk;Integrated Security=SSPI"))
{
conn.Open();
// Repeat this block as often as you like...
using (var tran = conn.BeginTransaction())
{
using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess1')", conn, tran))
{
cmd.ExecuteNonQuery(); // Shows in Sql profiler
}
tran.Commit(); // Commits
}
using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess2')", conn))
{
cmd.ExecuteNonQuery(); // Executes and commits (implicit transaction).
}
}
当然,为了健康的代码,您需要以正确的顺序处理所有对象。处理命令后处理命令SqlConnection
可能会导致连接对象保留在内存中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)