Интервьюер спросил: выберете... для блокировки обновления таблицу или строку?

Java MySQL

Оператор запроса select не будет заблокирован, ноselect .......for updateВ дополнение к роли запроса, он также будет блокировать, и это пессимистическая блокировка.

Затем он добавляет блокировку строки или блокировку таблицы, это зависит от того, используется ли индексный/первичный ключ.

Если индексный/первичный ключ не используется, это блокировка таблицы, в противном случае — блокировка строки.

проверять:

создать таблицу sql

//id为主键  
//name 为唯一索引
CREATE TABLE `user` (
 `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR ( 255 ) DEFAULT NULL,
 `age` INT ( 11 ) DEFAULT NULL,
    `code` VARCHAR ( 255 ) DEFAULT NULL,
 PRIMARY KEY ( `id` ),
    KEY `idx_age` ( `age` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 1570068 DEFAULT CHARSET = utf8

Autocommit должен быть отключен черезset @@autocommit=0;Установить ручную отправку. 0 означает отправку вручную, 1 означает автоматическую отправку.

图片

Подтвердить примерами

Пример 1:

Используйте идентификатор первичного ключа в качестве условия для запроса, а затем откройте другую транзакцию для обновления данных. Обновление заблокировано, заблокировано, а запрашиваемые данные строки с идентификатором 1 заблокированы.

  • На рис. 1 показана первая транзакция, и ни одна транзакция не зафиксирована.

  • На рисунке 2 показана вторая транзакция для обновления данных, которая заблокирована.

  • На рисунке 3 показана вторая транзакция, если блокировка не может быть получена в течение длительного времени, сообщается об ошибке.

图片

图片

图片

Пример 2:

Мы открываем транзакцию для обновления другого фрагмента данных с идентификатором 2.

图片

图片

Пример 3 (индекс):

В начале создания таблицы возраст создает уникальный индекс.

图片

图片

图片

Пример 4:

Используйте обычный код поля для работы

图片

图片

图片

В другой транзакции я обновляю другой фрагмент данных.Если я обновлю успешно, он заблокирует строку, а если не удастся, то заблокирует таблицу.

图片

图片

результат:

Если в условии запроса используется индекс/первичный ключ, тоselect ..... for updateбудет выполнена блокировка строки.

Если это обычное поле (без индекса/первичного ключа), тоselect ..... for updateБлокировка таблицы будет выполнена.