0

假设在 mysql 中,我想更新其中一个表中的列。我需要选择记录并更改值,然后将其更新回数据库。在某些情况下,我无法在一个 sql 查询中执行这两个操作并将它们嵌套到子查询中(由于 mysql 限制),我必须将其加载到程序中(比如说 Java),更改值,然后放回数据库。

例如,程序 A 获取一列的值,并希望将其增加一,然后将其放回。同时,程序 B 也想做同样的事情。在程序A放回增加的值之前,程序B已经得到了错误的值(程序B应该得到程序A增加的值,但它与程序A同时运行,所以它检索到的值与程序A相同)一个)。

现在我的问题是,处理这类问题的好方法是什么?

我的另一个问题是,我认为mysql不应该是一个单线程系统,但是假设有两个相同的查询(它们正在更新同一个表,相同的列和相同的记录)同时进来,mysql如何处理这种情况?哪个mysql先调度,哪个后调度?

此外,谁能解释一下mysql在多线程支持中是如何工作的?一个连接一个线程?那么在该连接下创建的所有语句都会安排在同一个队列中吗?

4

1 回答 1

1

如果你使用 InnoDB,你可以使用事务来提供细粒度的互斥。

如果您使用的是 MyISAM,您可以使用它LOCK TABLE来阻止 B 访问表,直到 A 完成更改。

如果两个客户端尝试同时更新同一个字段,则无法预测哪一个会赢得比赛。数据库有内部互斥来序列化这两个查询,但具体的顺序本质上是随机的。

于 2013-09-21T14:30:22.637 回答