1

我无法理解的场景:

一个名为 DBserver 的进程有五个线程,每个线程都有一个与 Mysql 数据库的连接。每次我们要执行一条sql,我们将它发送给DBserver,然后DBserver会选择一个线程来执行。现在来了两条sql,分别叫sqlA和sqlB,sqlA在sqlB之前,但是由于DBserver使用多线程,不能保证sqlA先于sqlB执行。如果 sqlB 真的在 sqlA 之前执行,我认为会发生错误。

例如:

sqlA:update bankTable set money = 10 where id = 10001;

sqlB:update bankTable set money = 100 where id = 10001;

如果sqlB在sqlA之前执行,最后钱是10,应该是100。但是这个DBserver已经上线,没有出现任何错误,我不知道为什么。非常感谢!

4

2 回答 2

1

为什么会出现错误?你的意思是说,这不是你期望发生的。就这样。但是这两个查询都可以按任何顺序执行,而不会出错。

对于这个例子,我假设 sqlA 总是在 sqlB 之前执行,因为两个查询中的工作是相同的,主线程会将查询传递给空闲线程。

但如果我们谈论更复杂的查询:我想这就是表锁定发挥作用的地方。

于 2013-04-15T11:04:23.363 回答
1

看来您想要的是保留 ACID 合规性,同时仍抽象单个 SQL 查询。

我的建议是构建一个接受 SQL 查询的类,以接受单个 SQL 查询(如字符串)或 SQL 查询列表。该列表意味着查询是相互依赖的,需要在同一个数据库连接上运行。

这在使用临时表时尤其重要,因为它们的范围仅限于数据库连接并且对其他连接保持不可见。

于 2013-04-15T11:12:15.710 回答