sql - 非事务表中的原子事务

标签 sql mysql transactions atomic

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

我想以原子方式执行此操作,两者都应该通过或都不应通过。

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

最佳答案

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

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

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;

关于sql - 非事务表中的原子事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697844/

相关文章:

c# - 多线程 Entity Framework 事务

java - 用于替换符号的正则表达式

sql - SQL Server 中 CTE 的列名

mysql - 我应该如何构建这个数据库?

php - 将 PHP 放在 SELECT 语句中

php - 如何在codeigniter中减去时间和日期?

iphone - 商店套件交易失败

mysql - MySQL 工作台是否显示未提交的更改?

mysql创建多个表

sql - 如何将 UNION 更改为 IN 子句?