问题描述
|
我正在研究.NET Framework 4中的数据访问以获得Microsoft认证,并且已经做了很多测试。
这次我想了解
sqlTransaction
类中IsolationLevel
的目的。据我了解,该选项使我可以决定一个事务中的易失数据是否可以被另一事务访问。也就是说,例如:我在事务1中创建了一个数据行,并且在提交该行之前,我可以在事务2中读取数据。
事实是我无法相互读取易失性数据。
如果我用2个事务创建1个连接,则会出现异常,因为sql Server不支持并行事务
如果我创建2个连接且每个事务有1个事务,则无论IsolationLevel的值如何,当我尝试在连接1处于事务中时访问连接2中的数据时,程序都会停止。当连接1离开事务时,程序将继续。
所以.. IsolationLevel的用途是什么?
PS:我这里不是在谈论分布式事务,而只是简单的sqlTransaction。
解决方法
您需要2个连接,2个事务,2个线程。
线程1:
using (SqlConnection conn = GetSqlConnection())
{
using (SqlTransaction trn = conn.BeginTransaction())
{
-- insert row into table here,then wait
}
}
线程2:
using (SqlConnection conn = GetSqlConnection())
{
using (SqlTransaction trn = conn.BeginTransaction(IsolationLevel.<desiredlevel>))
{
-- wait for thread 1 to insert then read row inserted by thread 1
}
}
在ReadUncommited
下,第二个线程将读取该行。在ѭ5下(如果在数据库中启用了快照),它将看不到它,但是不会阻塞。在所有其他隔离级别下,它将阻塞直到线程1提交或回滚。
,protected void Button3_Click(object sender,EventArgs e)
{
SqlConnection conn = new SqlConnection(Conn_String);
conn.Open();
SqlTransaction trans = conn.BeginTransaction(System.Data.IsolationLevel.Serializable);
SqlCommand cmd = new SqlCommand(\"update tbl_user_master set page_state=1\",conn);
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
call(trans,conn);
trans.Commit();
}
public void call(SqlTransaction trans,SqlConnection conn)
{
SqlCommand cmd = new SqlCommand(\"update tbl_user_master set page_state=0\",conn);
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
}
如果您具有1个SQL事务的多个功能,则使用此方法