String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
Убедитесь, что вы понимаете, почему. Это потому, что сравнение ==
сравнивает только ссылки; equals()
метод сопоставляет содержимое по символу.
Когда вы вызываете new для a
и b
, каждый получает новую ссылку, указывающую на "foo"
в таблице строк. Ссылки разные, но контент один и тот же.
Прочитайте https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html о согласованных чтениях в InnoDB. Каждый оператор SELECT гарантирует просмотр своего рода «снимка» данных, который не изменится, пока выполняется оператор SELECT.
Итак, вы правы, у вас есть риск, что оператор SELECT вернет значение для MIN(x)
, которого не будет после того, как ваш оператор SELECT выполнен, потому что он был удален за это время.
Это цена, которую мы платим за свободу выполнять запросы на чтение, не блокируя одновременные обновления / удаления.
Кстати, если вы хотите, чтобы MIN(x)
быстро возвращался, создайте индекс с x
в качестве первого столбца.