Mysql 选择的目的是什么*更新*?

Mysql 选择的目的是什么*更新*?,mysql,Mysql,我不明白为什么要指定更新—为什么数据库关心您将如何处理来自SELECT的数据 编辑:对不起,我问得不好。我知道文档说它把事情变成了锁定读取-我想知道的是,在哪些情况下,可观察到的行为在指定更新和不指定更新之间会有所不同-也就是说,锁定具体需要什么?选择更新告诉RDBMS您要锁定这些行,以便在您更新并提交或回滚并解锁这些行之前,其他人无法访问这些行: 例如,它会创建一个锁定读取,以便在完成之前没有人可以更新它 SELECT counter_field FROM child_codes FOR UP

我不明白为什么要指定更新—为什么数据库关心您将如何处理来自SELECT的数据


编辑:对不起,我问得不好。我知道文档说它把事情变成了锁定读取-我想知道的是,在哪些情况下,可观察到的行为在指定更新和不指定更新之间会有所不同-也就是说,锁定具体需要什么?

选择更新告诉RDBMS您要锁定这些行,以便在您更新并提交或回滚并解锁这些行之前,其他人无法访问这些行:


例如,它会创建一个锁定读取,以便在完成之前没有人可以更新它

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

请参见此处

它将锁定行或整个表,以便在另一个会话中不能同时更新行。锁定将一直保持,直到提交或回滚事务

它与在事务中锁定表有关。假设你有以下几点:

START TRANSACTION;
SELECT .. FOR UPDATE;
UPDATE .... ;
COMMIT;
在SELECT语句运行之后,如果您有另一个来自不同用户的SELECT语句,它将在您的第一个事务到达提交行之前不会运行


还要注意的是,在事务之外进行更新是没有意义的。

这是专门用于修复的特定情况,即当您需要读取和更新列中的值时。有时,您可以先更新列以锁定它,然后再读取它,例如:

UPDATE child_codes SET counter_field = counter_field + 1;
SELECT counter_field FROM child_codes;
这将返回counter_字段的新值,但这在您的应用程序中可能是可以接受的。如果您试图重置字段,因此需要原始值,或者如果您有一个无法在update语句中表示的复杂计算,则这是不可接受的。在这种情况下,为了避免两个连接同时竞相更新同一列,需要锁定该行

如果您的RDBMS不支持更新,那么您可以通过执行无用的更新来模拟它

UPDATE child_codes SET counter_field = counter_field;
SELECT counter_field FROM child_codes;
UPDATE child_codes SET counter_field = 0;

嗯?游标与此有什么关系?是的-我阅读了文档-但是这对RDBMS的用户有什么作用?啊-所以这可以让你做一些类似于启动事务的事情;从表格中选择MAXid+1作为更新的新ID;在表格id值中插入newid;承诺;-你知道MAX+1返回的值不会与其他任何人冲突吗?语句在分号处结束!更新和分号之间有什么关系?运行man!完成后!。语句在分号处终止我不理解-语句在分号处终止是-这意味着在上面的UPDATE示例中不影响UPDATE语句-因为它们是用分号分隔的独立语句,因此我对指令为什么需要存在感到困惑。当两个语句如果您完成了运行,那么您就完成了。也许这会使事务结束时变得更清楚。承诺。如果您启用了自动提交,并且运行的是单个语句,那么它就没有意义了。