MySQL / JDBC:如何“原子地”删除行,然后添加一个新行

时间:2017-11-23 19:26:17

标签: mysql jdbc atomic

我有以下情况:

1. DELETE FROM my_table WHERE user_id = ?;    // Prepared statement.
2. INSERT INTO my_table VALUES(?, ?, ..., ?); // Also a prepared statement.

问题1

假设两个客户端(让我们称之为AB)执行上述两个操作。 是否可能按如下方式执行所有四个操作?

  • A执行操作1.
  • B执行操作1.
  • A执行操作2.
  • B执行操作2.

(当我只想要1时,这将引入2个新行。)

问题2

如果问题1的答案是肯定的,我如何禁用上述的“交错”。或者换句话说,我如何确保A首先执行 操作1和2,然后 然后 B执行这两项操作。另外,如何使用JDBC完成此任务?

1 个答案:

答案 0 :(得分:1)

您描述的情况恰恰是大多数数据库管理系统支持Transaction management概念的原因。

  

事务是一组一个或多个以单元形式执行的语句,因此要么执行所有语句,要么不执行任何语句。

术语" atomic"用于表示发生的行为"作为一个单位"在上面的引文中。

对事务实施的进一步改进是Transaction isolation的概念。它描述了多个进程在事务有效的数据库上运行时应该如何运行。在您的具体情况下,

"我如何确保A首先执行操作1和2,然后B执行两个操作"

听起来你想要使用TRANSACTION_SERIALIZABLE的事务隔离级别(顾名思义)确保以有效" serial"的方式管理多个事务,例如,强制进程_等待process_A的事务完成。