我有以下情况:
1. DELETE FROM my_table WHERE user_id = ?; // Prepared statement.
2. INSERT INTO my_table VALUES(?, ?, ..., ?); // Also a prepared statement.
假设两个客户端(让我们称之为A
和B
)执行上述两个操作。 是否可能按如下方式执行所有四个操作?
A
执行操作1. B
执行操作1. A
执行操作2. B
执行操作2. (当我只想要1时,这将引入2个新行。)
如果问题1的答案是肯定的,我如何禁用上述的“交错”。或者换句话说,我如何确保A
首先执行 操作1和2,然后 然后 B
执行这两项操作。另外,如何使用JDBC完成此任务?
答案 0 :(得分:1)
您描述的情况恰恰是大多数数据库管理系统支持Transaction management概念的原因。
事务是一组一个或多个以单元形式执行的语句,因此要么执行所有语句,要么不执行任何语句。
术语" atomic"用于表示发生的行为"作为一个单位"在上面的引文中。
对事务实施的进一步改进是Transaction isolation的概念。它描述了多个进程在事务有效的数据库上运行时应该如何运行。在您的具体情况下,
"我如何确保A首先执行操作1和2,然后B执行两个操作"
听起来你想要使用TRANSACTION_SERIALIZABLE
的事务隔离级别(顾名思义)确保以有效" serial"的方式管理多个事务,例如,强制进程_等待process_A的事务完成。