Атомные преобразования в нетранзакционных таблицах - PullRequest
0 голосов
/ 15 января 2011

У меня есть 2 нетранзакционные таблицы. Я хочу выполнить «вставку» для одного и «обновление» для другого.

Я хочу сделать это атомарно, оба должны пройти или оба не должны.

Как этого добиться для нетранзакционных таблиц? Я использую MySql

Ответы [ 2 ]

2 голосов
/ 15 января 2011

Без механизма транзакций вам необходимо защитить код чтения и записи, который будет обращаться к базе данных.

Некоторый псевдокод для выполнения операций записи и чтения в критических разделах, защищенный семафором:

Semaphore sem;

bool method write (data) {
  lock(sem);
  ok  = do (insert data into table);
  prevdata = do (select olddata from table2);
  ok2 = do (update data into table2);
  if (ok && !ok2) do (delete date from table);
  else if (!ok && ok2) do (update olddata into table2);
  unlock(sem);
  return (ok && ok2);
}

datacontainer method read () {
  lock (sem);
  data = do (select data from table);
  unlock(sem);
  return data;
}

datacontainer method read2 () {
  lock (sem);
  data = do (select data from table2);
  unlock(sem);
  return data;
}

Синхронизация может быть оптимизирована в зависимости от ваших потребностей.

Если вы можете использовать InnoDB, это намного проще: в коде MySQL

START TRANSACTION;
INSERT INTO table (...) VALUES (...);
UPDATE table2 SET data=... WHERE ...;
COMMIT;
1 голос
/ 15 января 2011

Использование блокировка :

LOCK TABLES t1, t2 WRITE;
...
UNLOCK TABLES;

ПРИМЕЧАНИЕ: если какой-либо из запросов не выполнен, вам придется откатить их вручную! Поэтому убедитесь, что вы собрали INSERT_ID() s или каким-либо другим способом определения строк, которые вы вставляете. (10x ring0)

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

И убедитесь, что вы ВСЕГДА либо отключаетесь сразу после этой операции, либо выполняете запрос UNLOCK TABLES! В противном случае (например, если вы забыли разблокировать / умереть за исключением исключения при постоянном подключении к БД, в этих таблицах может возникнуть тупик!)

...