非事务性表中的原子事务

时间:2011-01-15 03:42:15

标签: sql mysql transactions atomicity

我有2个非交易表。我想在一个上执行'insert',在另一个上执行'update'。

我想以原子方式这样做,两者都应该通过,或者两者都不应该。

如何为非事务表实现此目的?我正在使用MySql

2 个答案:

答案 0 :(得分:2)

如果没有事务机制,则需要保护将访问数据库的读写代码。

在关键部分执行写和读操作的一些伪代码,通过信号量进行保护:

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 :(得分:1)

使用locking

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

注意:如果任何查询失败,您必须手动回滚!因此,请确保收集INSERT_ID()或其他一些方法来确定要插入的行。 (10x ring0)

如果在您的应用程序中经常发生这种情况 - 您将获得可怕的性能..在这种情况下,您最好使用其行锁定功能和事务切换到InnoDB。

确保您在此操作后始终断开连接或发出UNLOCK TABLES查询!否则(就像忘记在使用持久连接到DB时忘记解锁/死亡 - 你最终会在这些表上出现死锁!)