SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.07.2019 17:07:34

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Блокировка записей базы

Здравствуйте. Подскажите, а есть ли какой-нибудь способ заблокировать запись базы без дальнейшей ее возможности изменения.
Скажем я выдал товар с ID=3. И теперь мне надо, чтобы эту запись нельзя было бы изменить, в случае, если кто-то найдет дыру.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#2 24.07.2019 23:05:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Блокировка записей базы

Покурите пользовательские блокировки
https://dev.mysql.com/doc/refman/5.7/en … tions.html
, они работают по принципу mutex'ов.

Ну и тяжелые уровни изоляции транзакций, возможно, помогут.

А саму Вашу задачу опишите подробнее? Вы хотите заблокировать от других потоков того же исполняемого кода или же?..


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 24.07.2019 23:34:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Блокировка записей базы

Насколько я понял, речь про то, чтобы сделать какой-то write-only механизм (в смысле — нужна не блокировка, а постоянная неизменяемость).

Я вижу два способа разной степени костыльности:

1. Различные таблички.
Делаем две таблички с одинаковой структурой, при этом выдаем права на одну из них только на insert. Над ними делаем VIEW для чтения объединенных данных. Тогда перенесение из второй таблички в первую сделает так, что прав на изменение не будет.

Условно:
CREATE TABLE immutable (a INT);
CREATE TABLE mutable (a INT);
CREATE VIEW access SQL SECURITY INVOKER AS SELECT * FROM immutable UNION SELECT * FROM mutable;
GRANT SELECT, INSERT, UPDATE, DELETE ON dbname.mutable TO username@host;
GRANT SELECT, INSERT ON dbname.immutable TO username@host;

-- работаем с access, делаем immutable вот так:
INSERT INTO immutable SELECT * FROM mutable WHERE a = xxx;
DELETE FROM mutable WHERE a = xxx;


2. Триггеры.
Делаем дополнительное поле неизменяемости и триггер, который проверяет значение этого поля и запрещает изменение.

CREATE TABLE foo (a int, immutable TINYINT DEFAULT 0);
DELIMITER ;;
CREATE TRIGGER bu_foo BEFORE UPDATE ON foo FOR EACH ROW IF OLD.immutable != 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The row is immutable'; END IF;;
CREATE TRIGGER bd_foo BEFORE DELETE ON foo FOR EACH ROW IF OLD.immutable != 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The row is immutable'; END IF;;
DELIMITER ;

Неактивен

 

#4 25.07.2019 10:07:07

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Блокировка записей базы

Спасибо. Большое


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson