首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非事务性表中的原子事务

非事务性表中的原子事务
EN

Stack Overflow用户
提问于 2011-01-15 11:42:15
回答 2查看 438关注 0票数 0

我有两个非事务性的表。我想在一个上执行“插入”,在另一个上执行“更新”。

我想以原子的方式来做这件事,两个都应该通过或者都不应该通过。

对于非事务性的表,如何实现这一点?我正在使用MySql

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-15 11:49:46

使用locking

代码语言:javascript
复制
LOCK TABLES t1, t2 WRITE;
...
UNLOCK TABLES;

注意:如果任何查询失败,您将不得不手动回滚它们!因此,一定要收集INSERT_ID()或其他方法来确定要插入的行。(10倍ring0)

如果这种情况在你的应用程序中发生的太频繁,你会得到糟糕的性能。在这种情况下,您最好切换到具有行锁定功能和事务的InnoDB。

并确保您总是在此操作之后立即断开连接或发出UNLOCK TABLES查询!否则(比如在使用到DB的持久连接时忘记解锁/死于异常--您将在这些表上以死锁告终!)

票数 1
EN

Stack Overflow用户

发布于 2011-01-15 11:56:19

在没有事务机制的情况下,您需要保护将访问数据库的读写代码。

在临界区中执行写入和读取操作的一些伪代码,通过信号量保护:

代码语言:javascript
复制
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代码中

代码语言:javascript
复制
START TRANSACTION;
INSERT INTO table (...) VALUES (...);
UPDATE table2 SET data=... WHERE ...;
COMMIT;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4697844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档