Мертвая блокировка на ВЫБОРЕ/ОБНОВЛЕНИИ

Проще говоря, чтобы выполнять команды от имени пользователя root, вы должны использовать su (даже sudo использует su). Пока вы успешно выполняете sudo ./script2.sh, просто вместо этого: sudo su "#" // команды здесь как root "# Команды "exit // как здесь", вы можете сделать это функцией оболочки с именем sudo, но я думаю, что нет лучшего способа, как это происходит со скриптами inti, rc android ..etc должен быть аккуратным;)

однако для этого требуется, чтобы вы указали NOPASSWD: su действительно полностью безопасен

в любом случае здесь просто отсутствует принцип полномочий POISX, который заключается в фильтрации, поэтому не включайте что-либо для всех пользователей или просто просто вызывайте sudo тогда вы хотите без дополнительной информации:

chown root script.sh
chmod 0755 script.sh
chgrp sudo script.sh

«сделать владельца root .sh» «сделать его доступным только для чтения и выполнить для других» «и поместить его в группу sudo», конечно, под sudo вот и все

7
задан Community 23 May 2017 в 12:26
поделиться

1 ответ

Недостаточно иметь сериализуемую транзакцию, вам нужно намекнуть на блокировку, чтобы это работало.

Сериализуемый уровень изоляции по-прежнему обычно приобретает «самый слабый» тип блокировки, который он может, что обеспечивает выполнение условий сериализуемых (повторяемое чтение, отсутствие фантомных строк и т. Д.)

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

Вы, вероятно, захотите изменить его на следующее:

SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId

Это обеспечит получение блокировки обновления при выполнении SELECT (так что вам не нужно будет обновлять блокировку).

4
ответ дан 7 December 2019 в 14:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: