首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现在()如何与事务交互?

问现在()如何与事务交互?
EN

Stack Overflow用户
提问于 2015-12-02 11:39:16
回答 2查看 2K关注 0票数 3

我正在运行事务,这些事务对一个表执行多个更新(可能需要几秒钟),然后对另一个表执行另一个更新。最后更新的时间戳为NOW():UPDATE KeyTimestamps SET timestamp=NOW() WHERE key=$key。

我担心更新按一个顺序发生,但使用时间戳,它们看起来是按另一个顺序发生的。这样我们就有了如下的表状态序列:

代码语言:javascript
复制
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()返回一个常数时间,该时间指示语句开始执行的时间。

但是,一个查询能在另一个查询之前开始执行,然后执行吗?交易能保护我不受此影响吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-02 12:51:41

这是一个有点长的评论。

如果您想知道插入到表中的顺序,那么使用自动递增列。这是保证永远没有重复,并应分配的插入顺序。然后,可以使用时间戳列将此排序与排序进行比较。

注意,对于同时插入的两行,时间戳列可以是相同的。

票数 2
EN

Stack Overflow用户

发布于 2015-12-02 12:33:01

如手册所述,MySQL在每个语句的开头绑定NOW()的值。因此,如果在语句中多次使用该值,它将是相同的。

如果需要在多语句序列(事务)的开头绑定值,请执行以下操作:

代码语言:javascript
复制
SET @start := NOW();
SELECT something;
UPDATE something else;
...
UPDATE KeyTimestamps SET timestamp=@start WHERE key=$key

每个不同的客户端连接都将保留自己的变量值,如@start,因此,当您有多个客户端同时执行事务时,这将工作。

Beware:您在几乎同时从不同客户端发起的操作将以形式上不可预测的顺序运行。它们不会总是按照你的直觉告诉你的顺序运行。因此,请尽量避免依赖于系统设计中操作的精确顺序。自动递增ids也是如此。如果您确实使您的系统依赖于这样的事情,那么您就创造了种族条件的可能性。那些都是该死的谋杀。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34041840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档