我无法理解的情景:
一个名为DBserver的进程有五个线程,每个线程都有一个与Mysql数据库的连接。每次我们想要执行sql时,我们都会将它发送到DBserver,然后DBserver会选择一个执行的线程。现在有两个sql叫sqlA和sqlB,sqlA来自sqlB, 但由于DBserver使用多线程,因此无法保证在sqlB之前执行sqlA。 如果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已经上线并且没有发生任何错误,我不知道为什么。非常感谢你!
答案 0 :(得分:1)
为什么会发生错误?你的意思是说,它不是你期望发生的事情。就这样。但是这两个查询都可以按任何顺序执行,而不会出错。
对于这个例子,我假设sqlA总是在sqlB之前执行,因为两个查询中的工作是相同的,主线程将把查询传递给空闲线程。
但是如果我们谈论更复杂的查询:我想这就是表锁定发挥作用的地方。
答案 1 :(得分:1)
看起来你想要的是保留ACID合规性,同时仍然抽象单个SQL查询。
我建议的是构建一个使SQL查询接受单个SQL查询(如String)或SQL查询列表的类。该列表意味着查询是相互依赖的,需要在相同的数据库连接上运行。
在使用临时表时,这一点尤为重要,因为它们的作用域是数据库连接,并且其他连接仍然不可见。