Вопрос

У меня есть C # Application. Когда «Кнопка 1» Нажмите «Форма 1», у меня есть процесс, который записывает данные в несколько таблиц.Этот процесс обычно занимает 10 минут. Когда один пользователь нажмите на эту кнопку «1», другой пользователь, который использует ту же БД и программа, нажав на другую кнопку в другой форме, которая вставляет данные в те же таблицы.

Когда кнопка 1 нажав Я начинаю транзакцию SQL и комбитающую, что после завершения процесса.

Проблема заключается в том, чтобы запустить этот процесс, 2-й пользователь получает ошибку времени, и он не может завершить свой процесс.

Что я могу сделать для этого? Когда запуск транзакции SQL является блокировкой Thet таблиц, использующих для процесса?

Это было полезно?

Решение

Что я могу сделать для этого?

Переделать вашу транзакционную обработку.Серьезно.

Этот процесс обычно принимает 10 минут

10-минутная транзакция не практична ни в каких средств.Я не смогу увидеть никаких причин для этого за пределами плохой компенсионизации - и я делаю базу данных, возможно, 20 лет во всем.Никогда не терпимо и имел реальную потребность в транзакциях, которые долго, обычно есть способ вокруг него.

Да, вы можете изменить тайм-аут, но это означает, что пользователь 2 уставился на экран в течение 15 минут.Не реальное решение.

Переделать вашу транзакцию с логической точки зрения.Что такое, что вы делаете там, что займет 10 минут, чтобы начать с?

Другие советы

Простое решение Но может нужен пользователь, чтобы дождаться долгое время.

Если вы используете нить для выполнения этого (WinForm) с Label1, как рабочее состояние

   void transaction(data)
    { 
     try
     {
       thread.sleep(100);
       sqltransaction(data);//whatever your code is
     }
    catch(Exception)
     {
       transaction(data);
       label1.Invoke((MethodInvoker)(() => label1.Text = "Requested pending , do not close the program";
     }
       label1.Invoke((MethodInvoker)(() => label1.Text = "Working...";
    }
.

Это так, как я обычно решаю ошибку, что я не могу это исправить.

Спасибо

Транзакция по определению, блокируя другие транзакции, доступ к тем же ресурсам, потому что это так, как SQL Server гарантирует, что данные сохраняются в коммитке и не изменяются кем-то другим. Это

Так - то, что вы можете сделать, это либо сделать вашу транзакцию проходить быстрее, поэтому он не блокируется и не блокируется. Нанесите дольше ждать второго пользователя. Или не использовать транзакции вообще. (или обрабатывать ситуацию «лучше» в вашем слое кода, если оно «Ожидаемое поведение»)

Вы также можете проверить свои транзакции, которые он не блокирует слишком много, но если вторым процессом действительно необходимо получить доступ к тем же ресурсам, ему придется ждать.

Однако, если действительно желание получить «грязные», вы можете изменить уровни изоляции для сервера, чтобы позволить прочитать грязные данные, но это абсолютно не то, что я совет, если вы не знаете, что вы делаете. Но это то, что может ускорить чтение запросов, но он может иметь довольно странные последствия, чтение грязных данных и грязных страниц данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top