【问题标题】:MySQL/JDBC: How to "atomically" remove rows and then add one new rowMySQL/JDBC:如何“原子地”删除行,然后添加一个新行
【发布时间】:2017-11-23 19:26:17
【问题描述】:

我有以下场景:

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,然后然后 em> B 执行这两个操作。另外,如何用 JDBC 来实现呢?

【问题讨论】:

  • 你读过transaction吗?
  • @YCF_L 所以我首先禁用自动提交,进行更新并调用显式提交,对吗?
  • 是的,你必须把这两个操作放在同一个事务中,你可以在谷歌找到很多好文章,但我认为我分享的一篇可以帮助你

标签: mysql jdbc atomic


【解决方案1】:

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

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

术语“原子”用于指在上述引用中“作为一个单元”发生的动作。

对事务实现的进一步改进是Transaction isolation 的概念。它描述了多个进程在事务生效的数据库上操作时应如何表现。在您的具体情况下,

“我怎样才能确保 A 先执行操作 1 和 2,然后 B 执行这两个操作”

听起来您想使用TRANSACTION_SERIALIZABLE 的事务隔离级别(顾名思义)确保以有效“串行”的方式管理多个事务,例如,强制 process_B 等到 process_A 的事务完成了。

【讨论】:

猜你喜欢
  • 2023-02-24
  • 2011-06-06
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2017-12-18
  • 2015-02-13
相关资源
最近更新 更多