我有2个非交易表。我想在一个上执行'insert',在另一个上执行'update'。
我想以原子方式这样做,两者都应该通过,或者两者都不应该。
如何为非事务表实现此目的?我正在使用MySql
答案 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时忘记解锁/死亡 - 你最终会在这些表上出现死锁!)