Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / на суперсервере такое прокатит? развейте сомнения, плиз. / 20 сообщений из 20, страница 1 из 1
23.10.2019, 06:16
    #39880203
на суперсервере такое прокатит? развейте сомнения, плиз.
Всем привет.

Читал, что на суперсервере 1 процесс на всех клиентов.

Есть таблица mytable, поле num - integer. В таблице есть такие записи, в которых поле myfield не заполнено.

Если несколько разных клиентов выполнят так

update mytable set myfield = 'свои данные' where num = (select min(num) from mytable where myfield is null);

на суперсервере они ведь нормально разойдутся, суперсервер выполнит эти команды последовательно, без конкуренции?
...
Рейтинг: 0 / 0
23.10.2019, 06:24
    #39880205
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
ДеревянныйВсем привет.

Читал, что на суперсервере 1 процесс на всех клиентов.

Есть таблица mytable, поле num - integer. В таблице есть такие записи, в которых поле myfield не заполнено.

Если несколько разных клиентов выполнят так

update mytable set myfield = 'свои данные' where num = (select min(num) from mytable where myfield is null);

на суперсервере они ведь нормально разойдутся, суперсервер выполнит эти команды последовательно, без конкуренции?

Что значит "нормально разойдутся"?
Почитай про транзакции http://www.ibase.ru/transactions/ и версионность особенно http://www.ibase.ru/versions/
Архитектура сервера тут никаким боком.
...
Рейтинг: 0 / 0
23.10.2019, 06:55
    #39880208
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
ДеревянныйЧитал, что на суперсервере 1 процесс на всех клиентов.У SuperClassic, прикинь, тоже один процесс на всех клиентов.на суперсервере они ведь нормально разойдутся, суперсервер выполнит эти команды последовательно, без конкуренции?У SuperServer, до версии 2.1 включительно, все потоки будут исполняться на одном ядре.
В версии 2.5 SuperServer может "разбросать" потоки подключений к разным базам на разные ядра, но потоки всех подключений к одной базе всё равно исполняются на одном ядре. SuperServer 3.0 "умеет" распределяет потоки по ядрам без ограничений.
Но, как уже сказали, вне зависимости от версии и архитектуры, конкурентная среда всегда остаётся конкурентной средой.
Ограничение "многие (все) потоки на одном ядре" ограничивает производительность сервера, но не меняет принципов работы с транзакциями.
...
Рейтинг: 0 / 0
23.10.2019, 07:14
    #39880211
на суперсервере такое прокатит? развейте сомнения, плиз.
да, книжку уже читаю, спасибо. пока мало что понятно, много новых слов.



в приложении транзакция (TIBTransaction) стартует, в ней выполняется та команда, и сразу комитится.

а "разойдутся" это я имел ввиду получат ли они себе разные записи или им могут один и тот же num вернуть селектом?
...
Рейтинг: 0 / 0
23.10.2019, 08:06
    #39880218
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Оформляем вопрос по человечески :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table test (
   num integer
 , msg varchar(100)
);
commit;
insert into test(num, msg) values(0, null);
commit;

-- переходим к микротесту
update mytable
set msg = 'Текст'
where num = (select min(num) from mytable where myfield is null);

-- запускаем второй isql, где выполняем второй update
-- потом делаем commit/rollback в разной последовательности
-- и читаем ibase.ru. Лучше - до экспериментов
...
Рейтинг: 0 / 0
23.10.2019, 08:11
    #39880220
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Деревянныйа "разойдутся" это я имел ввиду получат ли они себе разные записи или им могут один и тот же num вернуть селектом?Вы num меняете? Нет. Значит возможны два варианта:
1. Записей с минимальным значением поля num - больше одной. Будет ошибка ("Магия данных");
2. Запись одна и два (или более) запроса будут конкурентно обновлять одну и ту же запись. Будет конфликт.
...
Рейтинг: 0 / 0
23.10.2019, 09:02
    #39880229
на суперсервере такое прокатит? развейте сомнения, плиз.
Basil A. SidorovВы num меняете? Нет. Значит возможны два варианта:
1. Записей с минимальным значением поля num - больше одной. Будет ошибка ("Магия данных");
2. Запись одна и два (или более) запроса будут конкурентно обновлять одну и ту же запись. Будет конфликт.

ок, ответ понятен. первый вариант у меня не случится, num заполняется генератором, а со вторым ясно.

а вот тут http://www.ibase.ru/ibtrans/ в доках упоминается сериализуемость, которая явно не реализована, но которую можно эмулировать. А как?
...
Рейтинг: 0 / 0
23.10.2019, 09:23
    #39880243
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Деревянныйа вот тут http://www.ibase.ru/ibtrans/ в доках упоминается сериализуемость, которая явно не реализована, но которую можно эмулировать.

наверное имеется в виду резервирование таблиц
...
Рейтинг: 0 / 0
23.10.2019, 09:24
    #39880247
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Никак
Не надо упорядочивать (сериализовывать) обновления без очень веской причины: вы ставите в очередь всех клиентов, собственными руками организовывая "дикую конкуренцию" (ТМ). Рано или поздно этих конкурентов окажется "десятков несколько" и вас проклянут все ваши пользователи, которые попадут на такой режим работы.
...
Рейтинг: 0 / 0
23.10.2019, 09:33
    #39880251
на суперсервере такое прокатит? развейте сомнения, плиз.
вижу про сериализацию там ниже есть немного описание. только не въезжаю. :) у меня транзакция как раз короткая. что надо ей в параметрах указать, чтобы всем запретить чтение и запись в эту таблицу пока эта транзакция не выполнится?

wait
consistency
lock_read=mytable
lock_write=mytable
exclusive

угадал?
...
Рейтинг: 0 / 0
23.10.2019, 09:39
    #39880260
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Деревянный,

нет не угадал. Чтение ты не запретишь никак. Запись можешь
...
Рейтинг: 0 / 0
23.10.2019, 09:39
    #39880261
на суперсервере такое прокатит? развейте сомнения, плиз.
Basil A. SidorovНикак
Не надо упорядочивать (сериализовывать) обновления без очень веской причины: вы ставите в очередь всех клиентов, собственными руками организовывая "дикую конкуренцию" (ТМ). Рано или поздно этих конкурентов окажется "десятков несколько" и вас проклянут все ваши пользователи, которые попадут на такой режим работы.

да, это я тоже понимаю. Но с другой стороны, нечего двум пользователям одну запись редактировать. А раз уж они туда оба полезли, то могут подождать 1 секунду.
...
Рейтинг: 0 / 0
23.10.2019, 09:43
    #39880264
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Деревянный,

зачем такой изврат? Чем тебя не устраивает SELECT ... FOR UPDATE WITH LOCK
...
Рейтинг: 0 / 0
23.10.2019, 09:44
    #39880267
на суперсервере такое прокатит? развейте сомнения, плиз.
Симонов ДенисДеревянный,

нет не угадал. Чтение ты не запретишь никак. Запись можешь

понятно. два или три клиента пытаются сделать

update mytable set myfield = 'свои данные' where num = (select min(num) from mytable where myfield is null);

транзакции короткие, сразу комитятся. Если я им в параметрах укажу

wait
consistency
lock_write=mytable
exclusive

то тогда эти транзакции будут выполнены последовательно?
...
Рейтинг: 0 / 0
23.10.2019, 09:46
    #39880268
на суперсервере такое прокатит? развейте сомнения, плиз.
Симонов ДенисДеревянный,

зачем такой изврат? Чем тебя не устраивает SELECT ... FOR UPDATE WITH LOCK

это для меня тоже новая информация. так делать можно?

update mytable set myfield = 'свои данные' where num = (select min(num) from mytable where myfield is null FOR UPDATE WITH LOCK );
...
Рейтинг: 0 / 0
23.10.2019, 09:52
    #39880277
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Деревянный,

так нельзя. Этот оператор нужен чтобы блокировать выбранную запись, т.е. запретить UPDATE/DELETE другим транзакциям на время работы текщуей транзакции. Но он работает только с простым SELECT из одной таблицы без агрегатов. И это не обохначает что будет тупо ожидание, просто возникнет обычный UPDATE CONFLICT
...
Рейтинг: 0 / 0
23.10.2019, 09:58
    #39880282
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Симонов ДенисЧтение ты не запретишь никак.Да ну
...
Рейтинг: 0 / 0
23.10.2019, 10:06
    #39880291
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
Деревянныйдва или три клиента пытаются сделать

update mytable set myfield = 'свои данные' where num = (select min(num) from mytable where myfield is null);

транзакции короткие, сразу комитятся. Если я им в параметрах укажу

wait
consistency
lock_write=mytable
exclusive

то тогда эти транзакции будут выполнены последовательно?Эти - да.
...
Рейтинг: 0 / 0
23.10.2019, 10:06
    #39880292
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
hvladСимонов ДенисЧтение ты не запретишь никак.Да нуПерепроверил - ты прав, не consistency тр-ции смогут читать.
...
Рейтинг: 0 / 0
23.10.2019, 14:56
    #39880494
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
на суперсервере такое прокатит? развейте сомнения, плиз.
ДеревянныйСимонов ДенисДеревянный,

зачем такой изврат? Чем тебя не устраивает SELECT ... FOR UPDATE WITH LOCK

это для меня тоже новая информация. так делать можно?

update mytable set myfield = 'свои данные' where num = (select min(num) from mytable where myfield is null FOR UPDATE WITH LOCK );

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

если в разные моменты времени возможны разные значения min(num), то ни того, ни другого у пользователя нет.


если в with lock указать чОткое, конкретное значение num, то сервер заблокирует(займет) записи для этого пользователя.

если другой пользователь, знающий о существовании других пользователей, и пользующийся принятыми в их среде методами, тоже попробует with lock - он получит вменяемое сообщение о конфликте и может отказаться от действия или попробовать повторить его позже.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / на суперсервере такое прокатит? развейте сомнения, плиз. / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]