Какая польза от IsolationLevel в SqlTransaction, если мне никогда не удается прочитать изменчивые данные из одной транзакции в другую? - PullRequest
2 голосов
/ 14 апреля 2011

Я изучаю доступ к данным в .NET Framework 4 для сертификации Microsoft и провёл много тестов.

На этот раз я хочу понять цель IsolationLevel в классе SqlTransaction. Как я понимаю, эта опция позволяет мне решить, доступны ли изменчивые данные в одной транзакции другой. То есть, например: я создаю строку данных в транзакции 1 и, прежде чем ее зафиксировать, могу прочитать данные в транзакции 2.

Дело в том, что я не могу читать изменчивые данные из одного в другой.

  • Если я создаю 1 соединение с 2 транзакциями Я получаю исключение, поскольку SQL Server не поддерживает параллельные транзакции
  • Если я создаю 2 соединения с 1 транзакцией каждое, независимо от значения IsolationLevel, программа останавливается, когда я пытаюсь получить доступ к данным в соединении 2, когда соединение 1 находится в транзакции , Когда соединение 1 покидает транзакцию, программа продолжается.

Итак .. Какая польза от IsolationLevel?

PS: Я не говорю о распределенных транзакциях, просто о SqlTransaction.

Ответы [ 2 ]

8 голосов
/ 14 апреля 2011

Вам нужно 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 второй поток будет читать строку.При Snapshot (если в базе данных включен моментальный снимок) он не увидит его, но не заблокирует.На всех других уровнях изоляции он будет блокироваться до тех пор, пока поток 1 не зафиксируется или не откатится назад.

1 голос
/ 23 сентября 2011
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();

}

Это используется, если у вас есть несколько функций с одной транзакцией SQL

...