Вопрос
У меня есть 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 гарантирует, что данные сохраняются в коммитке и не изменяются кем-то другим. Это
Так - то, что вы можете сделать, это либо сделать вашу транзакцию проходить быстрее, поэтому он не блокируется и не блокируется. Нанесите дольше ждать второго пользователя. Или не использовать транзакции вообще. (или обрабатывать ситуацию «лучше» в вашем слое кода, если оно «Ожидаемое поведение»)
Вы также можете проверить свои транзакции, которые он не блокирует слишком много, но если вторым процессом действительно необходимо получить доступ к тем же ресурсам, ему придется ждать.
Однако, если действительно желание получить «грязные», вы можете изменить уровни изоляции для сервера, чтобы позволить прочитать грязные данные, но это абсолютно не то, что я совет, если вы не знаете, что вы делаете. Но это то, что может ускорить чтение запросов, но он может иметь довольно странные последствия, чтение грязных данных и грязных страниц данных.