Блокировка строки базы данных - PullRequest
1 голос
/ 01 июня 2011

Моя программа на C # выполняет следующее (псевдокод):

START TRANSACTION READ COMMITTED
Select isOriginal, * from myTable where tnr = x;
//Record found?
Yes:
  //isOriginal? 
  Yes:
    update myTable set is_active = 0 where tnr = x;
  No:
    delete from myTable where tnr = x;
  //Do some simple logic on the values
  Insert into myTable (newvalues)
No:
  return record_not_found;
END TRANSACTION

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

Что должно произойти, так это то, что первая транзакция находит запись и вставляет новую строку, а вторая транзакция возвращает запись, не найденную.

Как я могу это исправить? Поместить мою транзакцию в сериализуемый? Проверить возвращаемое значение обновления / удаления? Какой лучший способ?

Редактировать :

Должно работать на Sybase, Oracle и SQL Server.

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

, не зная, какую БД вы используете, вы можете установить поле блокировки в БД.

, где каждый параллельный поток имеет идентификатор pid или потока или, по крайней мере, уникальную временную отметку, просто выполните

update myTable set lock = <pid> where pid = null limit 1;

select isOriginal, * from myTable where lock = <pid>
0 голосов
/ 01 июня 2011

Если вы используете MS SQL Вам нужно будет посмотреть на NOLOCK, а ROWLOCK NOLOCK говорит SQL Server игнорировать любые типы блокировок и читать непосредственно из фактических таблиц.Преимущество в том, что у него отличная производительность, а в том, что вы обходите заблокированную систему.ROWLOCK, с другой стороны, просит SQL Server использовать блокировки на уровне строк.Производительность мешает работе с блокировкой строк, поэтому вам нужно определить, нужно ли вам блокировать UPDATES / DELETES

В вашем случае SELECT isOriginal, * FROM myTable WITH (NOLOCK) WHERE tnr=x

Тогда UPDATE myTable WITH (ROWLOCK) SET is_active=0 WHERE tnr=x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...