Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Basil A. Sidorov

вернёт заданные поля вставленной записи. Если, конечно, есть поддержка в драйвере.
Если нет, то на первом проходе делаем вставку, а на втором - выбираем искомые идентификаторы для всех исходных значений. Коряво, но вполне работоспособно.


asv79
Но вот когда ты сталкиваешься с многопоточкой

Одна сессия вставили и НЕ закомитела

Вторая сессия пытается вставить - получает exceptin
Пытается получить ID-ник SELECT'ом - а облом )))

Первая сессия коммитет, но второй это уже не поможет

p.s. в сообщении 22314707 no_data_found конечно опечатка, скорее всего, что-то типа DUP_VAL_ON_INDEX будет
26 апр 21, 20:03    [22314715]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Leonid Kudryavtsev
Одна сессия вставили и НЕ закомитела

Вторая сессия пытается вставить - получает exceptin
Пытается получить ID-ник SELECT'ом - а облом )))

Первая сессия коммитет, но второй это уже не поможет
Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице.

На самом деле так:
1. tx1 началась, вставила запись
2. tx2 началась, при вставке заблокировалась на изменении индекса. Ну а дальше два возможных варианта:
3.a tx1 делает коммит, что разблокирует tx2 и та валится с исключением
3.b tx1 делает rollback, что разблокирует tx2 и та удачно вставляет

Сообщение было отредактировано: 26 апр 21, 22:22
26 апр 21, 22:28    [22314780]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
asv79, я тут только счас понял что SELECT делается потому что у Email'ов есть ID. Так вот.. Раз email'ы уникальные, почему бы вообще не избавиться от суррогатного Primary Key и не использовать email в качестве PK? Тогда SELECT вообще не нужен будет. А в Foreign Key можно прям email и писать.

Хотя наверно ты мигрируешь в уже готовую схему, менять ее уже не выйдет..

Сообщение было отредактировано: 26 апр 21, 22:35
26 апр 21, 22:40    [22314789]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Bsplesk
Member

Откуда:
Сообщений: 242
Без классов прям совсем никак (или mybatics?)? Хотя предложенный ранее insert/on conflict retur... выглядит более логичным.
BEGIN;
-- другие операции
SAVEPOINT sp1;
INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
-- Предполагая, что здесь возникает ошибка из-за нарушения уникальности ключа,
-- мы выполняем следующие команды:
ROLLBACK TO sp1;
UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003';
-- Продолжение других операций и в завершение...
COMMIT;


Сообщение было отредактировано: 27 апр 21, 00:09
27 апр 21, 00:11    [22314823]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Stanislav Bashkyrtsev
Leonid Kudryavtsev
Одна сессия вставили и НЕ закомитела

Вторая сессия пытается вставить - получает exceptin
Пытается получить ID-ник SELECT'ом - а облом )))

Первая сессия коммитет, но второй это уже не поможет
Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице.

Получит.
27 апр 21, 01:56    [22314839]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2337
asv79
зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов

Херово жить без профильного образования. Когда ты делаешь 6 раз гет у тебя ничего не выполняется в этот момент? Гет берется из астрала за 0,5 такта цп?
А что я говорил в прошлом треде? Вот, ты опять танцуешь вокруг своей орм с костылями и подпорками, а мы смотрим и смеёмся.

Сообщение было отредактировано: 27 апр 21, 03:59
27 апр 21, 04:03    [22314843]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
crutchmaster
asv79
зато работает быстро - если ввести переменную -замедляется процесс ,так как все это в цикле ,в котром будет куча мусора из под этих временных объектов

Херово жить без профильного образования. Когда ты делаешь 6 раз гет у тебя ничего не выполняется в этот момент? Гет берется из астрала за 0,5 такта цп?
А что я говорил в прошлом треде? Вот, ты опять танцуешь вокруг своей орм с костылями и подпорками, а мы смотрим и смеёмся.

смотри я ж не просто так сделал все эти длинные касты- я протестировал с ними и без них - создание нового объекта очень сильно нагружает процесс - и да - пусть код не очень хорошо читаем,но он быстрее где то на 20%

орм то тут причем? или мне может пойти к руководству и сказать - давайте братцы - выделите бюджет млн 10 -15 на переписку сервисва на ждбси?)))
27 апр 21, 09:05    [22314882]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Stanislav Bashkyrtsev
asv79, я тут только счас понял что SELECT делается потому что у Email'ов есть ID. Так вот.. Раз email'ы уникальные, почему бы вообще не избавиться от суррогатного Primary Key и не использовать email в качестве PK? Тогда SELECT вообще не нужен будет. А в Foreign Key можно прям email и писать.

Хотя наверно ты мигрируешь в уже готовую схему, менять ее уже не выйдет..

да у емайл есть id поэтму до кучи мне пришлось переделать их с identity на sequence иначе селекты вообще не проходили - так как присовоение id идет при записи

пс.да миграция идет в готовую схему - которую никто не даст менять поэтому приходится работать с невалидными данными со стороны монго и с другой постгрес - которая не отвечает даже 1 нф
27 апр 21, 09:10    [22314883]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Leonid Kudryavtsev
Basil A. Sidorov

...Или это слишком банально и содержит мало объектных типов?

IMHO скорее всего не поможет. Ему еще ID'шник из базы получить нужно. А тут даже

try {
INSERT ...
} exception WHEN_NO_DATA_FOUND {
SELECT ...
}

может не помочь, при обычном Read committed )))

такая схема работает
инсерт в try ->exeption ->catch ->select
правда скорость оставляет желать лучшего ,но по крайне мере я добился чего и хотел
27 апр 21, 09:13    [22314884]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Leonid Kudryavtsev


Скорее всего должен быть обернут в synchronized.
А если мы хотим еще данный список еще и с БД поддерживать в корректном состоянии, то и insert и commit так же должен быть в этом же блоке synchronized.

IMHO

посмотри сюда на первое сообщение

СoncurrentSkipListSet<String> concurrentSkipListSet
27 апр 21, 09:15    [22314887]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Leonid Kudryavtsev
Stanislav Bashkyrtsev
пропущено...
Вторая транзакция не получит exception пока первая не закоммитит, иначе это бы нарушало изоляцию READ COMMITTED. Мол, вставить запись не могу, хоть даже записей с таким значением нет в таблице.

Получит.
Может проверишь? Я вот проверил.
asv79
орм то тут причем? или мне может пойти к руководству и сказать - давайте братцы - выделите бюджет млн 10 -15 на переписку сервисва на ждбси?)))
В целом-то сервис не обязательно трогать, только миграцию писать на JDBC.

Сообщение было отредактировано: 27 апр 21, 09:13
27 апр 21, 09:20    [22314889]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
[quot Stanislav Bashkyrtsev#22314670 Я правда не понял зачем ты вообще SELECT делаешь, если у тебя и так email есть.. Получается какой-то бесполезный
select email from USERS where email = ?


/quot]
все очень просто - там три сущности - первая это ящик- далее рассылка и третья M2M
тоесть я пишу рассылку далее в цикле прогоняю ящики и м2м
для чего нужен такой селект - чтобы у меня на руках был id емайл которй я могу записать в м2м
вообщем трай кетч работает - большего и не требуется
27 апр 21, 09:20    [22314890]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
>там три сущности - первая это ящик- далее рассылка и третья M2M
=незачет. След топик начинай с DDL)))))
27 апр 21, 09:40    [22314899]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш.
27 апр 21, 09:42    [22314902]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2337
asv79
орм то тут причем?

Притом, что ты пляшешь вокруг него с подпорками и приседаешь.
asv79
создание нового объекта

Ссылки ты хотел сказать? Нагружает процесс, да?
asv79
или мне может пойти к руководству и сказать

Да не надо тебе ничего менять, всё нормально. Ты же сам его выбрал и рассказываешь, какой он крутой.
27 апр 21, 10:23    [22314923]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79,
Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш.

вот это новость ) а кто то утверждал что нельзя?
а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id)
27 апр 21, 10:35    [22314934]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
Basil A. Sidorov

Многопоточная вставка это то, что не надо делать с базой.

в одном потоке слишком долго,хотя SLA на процессы нет - то может и придется писать в однопоточке
27 апр 21, 10:39    [22314938]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
PetroNotC Sharp
asv79,
Новые сущности, в эксклюзивном режиме, можно писать без генерации айди в бд. Джун ты наш.

вот это новость ) а кто то утверждал что нельзя?
а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id)
эх джун.
Вставляем мастер с айди 123 и потом в детайль с этим же 123.
Ничего запрашивать не надо.
27 апр 21, 10:42    [22314939]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79
Basil A. Sidorov

Многопоточная вставка это то, что не надо делать с базой.

в одном потоке слишком долго,хотя SLA на процессы нет - то может и придется писать в однопоточке
для этого нужно 3 страницы?
Ты с работающей однопоточки начать должен был.
Потом тюнинг.
27 апр 21, 10:44    [22314940]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3319
PetroNotC Sharp
asv79
пропущено...

вот это новость ) а кто то утверждал что нельзя?
а вот если сущнность содержит ссылку на другую сущность - то вроде как уже нужен id)
эх джун.
Вставляем мастер с айди 123 и потом в детайль с этим же 123.
Ничего запрашивать не надо.

ааа вот оно чо ,а айди то ты где возьмешь)
27 апр 21, 11:05    [22314952]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Выше писал. Счетчик на клиенте. Хоть до миллиарда. Потом вкл индекс PK
27 апр 21, 11:09    [22314954]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
asv79,
Есть куча решений. Но:
- ты не дал DDL
- ты слился
- ты не сделал однопоточку и не дал цифры
27 апр 21, 11:10    [22314956]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
Leonid Kudryavtsev
asv79
Но вот когда ты сталкиваешься с многопоточкой
Одна сессия вставили и НЕ закомитела
Это типа, прикол такой - наступать на элементарные грабли??? Или хочется как в анекдоте: "А вы на шкаф залезьте".
И даже если не касаться азов устройства СУБД, то задлянафига в сугубо последовательном процессе многопоточка? Чтобы оно сразу было и сразу глючило?
27 апр 21, 12:39    [22315012]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11020
asv79
в одном потоке слишком долго
Если вставка в два потока работает быстрее вставки в один поток, то, скорее всего, "ваш код - отстой".
27 апр 21, 12:43    [22315016]     Ответить | Цитировать Сообщить модератору
 Re: Как избежать проблем )  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Для больших объемов в PostgreSQL есть команда COPY, на порядки быстрее INSERT'ов.

AFAIK
27 апр 21, 13:17    [22315040]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Java Ответить