我有两个非事务性的表。我想在一个上执行“插入”,在另一个上执行“更新”。
我想以原子的方式来做这件事,两个都应该通过或者都不应该通过。
对于非事务性的表,如何实现这一点?我正在使用MySql
发布于 2011-01-15 11:49:46
使用locking
LOCK TABLES t1, t2 WRITE;
...
UNLOCK TABLES;注意:如果任何查询失败,您将不得不手动回滚它们!因此,一定要收集INSERT_ID()或其他方法来确定要插入的行。(10倍ring0)
如果这种情况在你的应用程序中发生的太频繁,你会得到糟糕的性能。在这种情况下,您最好切换到具有行锁定功能和事务的InnoDB。
并确保您总是在此操作之后立即断开连接或发出UNLOCK TABLES查询!否则(比如在使用到DB的持久连接时忘记解锁/死于异常--您将在这些表上以死锁告终!)
发布于 2011-01-15 11:56:19
在没有事务机制的情况下,您需要保护将访问数据库的读写代码。
在临界区中执行写入和读取操作的一些伪代码,通过信号量保护:
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;https://stackoverflow.com/questions/4697844
复制相似问题