我正在运行事务,这些事务对一个表执行多个更新(可能需要几秒钟),然后对另一个表执行另一个更新。最后更新的时间戳为NOW():UPDATE KeyTimestamps SET timestamp=NOW() WHERE key=$key。
我担心更新按一个顺序发生,但使用时间戳,它们看起来是按另一个顺序发生的。这样我们就有了如下的表状态序列:
key | timestamp
----+--------------------
A | 1970-01-01 00:00:00
B | 1970-01-01 00:00:00
key | timestamp
----+--------------------
A | 2015-12-02 12:00:00
B | 1970-01-01 00:00:00
key | timestamp
----+--------------------
A | 2015-12-02 12:00:00
B | 2015-12-02 11:59:59这会发生吗?手动他说
NOW()返回一个常数时间,该时间指示语句开始执行的时间。
但是,一个查询能在另一个查询之前开始执行,然后执行吗?交易能保护我不受此影响吗?
发布于 2015-12-02 12:51:41
这是一个有点长的评论。
如果您想知道插入到表中的顺序,那么使用自动递增列。这是保证永远没有重复,并应分配的插入顺序。然后,可以使用时间戳列将此排序与排序进行比较。
注意,对于同时插入的两行,时间戳列可以是相同的。
发布于 2015-12-02 12:33:01
如手册所述,MySQL在每个语句的开头绑定NOW()的值。因此,如果在语句中多次使用该值,它将是相同的。
如果需要在多语句序列(事务)的开头绑定值,请执行以下操作:
SET @start := NOW();
SELECT something;
UPDATE something else;
...
UPDATE KeyTimestamps SET timestamp=@start WHERE key=$key每个不同的客户端连接都将保留自己的变量值,如@start,因此,当您有多个客户端同时执行事务时,这将工作。
Beware:您在几乎同时从不同客户端发起的操作将以形式上不可预测的顺序运行。它们不会总是按照你的直觉告诉你的顺序运行。因此,请尽量避免依赖于系统设计中操作的精确顺序。自动递增ids也是如此。如果您确实使您的系统依赖于这样的事情,那么您就创造了种族条件的可能性。那些都是该死的谋杀。
https://stackoverflow.com/questions/34041840
复制相似问题