Size: a a a

DBA - русскоговорящее сообщество

2021 January 26

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Konstantin
Народ, подскажите плз, в постгресе возможно вернуть значение из анонимного блока кода?
DO
$$
   BEGIN
       IF EXISTS
           (SELECT 1
            FROM ids
            WHERE table_name = 'widget'
              AND field_name = 'widgetid'
           )
       THEN
           UPDATE ids
           SET nextid = nextid + 1
           WHERE table_name = 'widget'
             AND field_name = 'widgetid'
           RETURNING nextid;
       END IF;
   END
$$ LANGUAGE plpgsql;

Сейчас падает с ошибкой
ERROR: query has no destination for result data
Блин, это ПГ, я тебе для оракла ответил...  Там другое...
источник

N

Nikolay in DBA - русскоговорящее сообщество
Обьясните, как работает 2х фазный коммит? Все равно ведь нельзя одновременно выполнить транзакции. Т.е какая-то будет видна раньше, а какая-то позже. Получается, что не будет атомарности? в какой-то момент можно увидеть только часть изменений
источник

K

Konstantin in DBA - русскоговорящее сообщество
Ilia Zviagin
Нельзя, надо отрыть запрос как курсор, и вернуть ссылку на него (курсор).
А потом на клиенте его фетчить.

Некоторые клиенты умеют делать это автоматом. SQLPlus нет
Понял, спасибо
Наверно курсором и сделаю)
источник

K

Konstantin in DBA - русскоговорящее сообщество
Yaroslav Schekin
Нет, нельзя (есть только hack с refcursor).
понял, спасибо
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Nikolay
Обьясните, как работает 2х фазный коммит? Все равно ведь нельзя одновременно выполнить транзакции. Т.е какая-то будет видна раньше, а какая-то позже. Получается, что не будет атомарности? в какой-то момент можно увидеть только часть изменений
Какое отношение имеет видимость к атомарности?
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Nikolay
Обьясните, как работает 2х фазный коммит? Все равно ведь нельзя одновременно выполнить транзакции. Т.е какая-то будет видна раньше, а какая-то позже. Получается, что не будет атомарности? в какой-то момент можно увидеть только часть изменений
2фазный комит к видимости никак не относится (он её не меняет)
источник

N

Nikolay in DBA - русскоговорящее сообщество
Yaroslav Schekin
Какое отношение имеет видимость к атомарности?
хороший вопрос. с одной стороны можно смотреть на атомарность, как гарантию того, что применится все или ничего. и в таком понимании 2PC согласуется с этим. Но вот в той же вики в теме про Атормарность ест и такие слова " As a consequence, the transaction cannot be observed to be in progress by another database client" . А в случает 2PC выходит, что я могу это увидеть. в одной системе я увижу данные уже закомиченными, а в другой еще не. Т.е я увижу как раз тот самый progress транзакции . https://en.wikipedia.org/wiki/Atomicity_(database_systems)
источник

N

Nikolay in DBA - русскоговорящее сообщество
Ilia Zviagin
2фазный комит к видимости никак не относится (он её не меняет)
почему? если у меня 2 системы. Допустим, что в одной системе, я записываю 1 insert, а в другой другой инсерт. всего у меня 2 Insert. Т.е должен я увидеть сразу 2 строки. А так получается, что я могу их проверить и увижу только 1... а потом через какое-то время увижу уже 2.
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Nikolay
почему? если у меня 2 системы. Допустим, что в одной системе, я записываю 1 insert, а в другой другой инсерт. всего у меня 2 Insert. Т.е должен я увидеть сразу 2 строки. А так получается, что я могу их проверить и увижу только 1... а потом через какое-то время увижу уже 2.
Ты это про распределённые транзакции, видимо. А сначала ты про 2PC спрашивал.
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Nikolay
хороший вопрос. с одной стороны можно смотреть на атомарность, как гарантию того, что применится все или ничего. и в таком понимании 2PC согласуется с этим. Но вот в той же вики в теме про Атормарность ест и такие слова " As a consequence, the transaction cannot be observed to be in progress by another database client" . А в случает 2PC выходит, что я могу это увидеть. в одной системе я увижу данные уже закомиченными, а в другой еще не. Т.е я увижу как раз тот самый progress транзакции . https://en.wikipedia.org/wiki/Atomicity_(database_systems)
> А в случает 2PC выходит, что я могу это увидеть.

Не выходит. "Половину" транзакции Вы не увидите.

> в одной системе я увижу данные уже закомиченными, а в другой еще не.

Да, и это нормально.

> Т.е я увижу как раз тот самый progress транзакции .

Нет. Никакой "распределённой ACID транзакции" в 2PC нет, он именно и только про атомарность.
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Yaroslav Schekin
> А в случает 2PC выходит, что я могу это увидеть.

Не выходит. "Половину" транзакции Вы не увидите.

> в одной системе я увижу данные уже закомиченными, а в другой еще не.

Да, и это нормально.

> Т.е я увижу как раз тот самый progress транзакции .

Нет. Никакой "распределённой ACID транзакции" в 2PC нет, он именно и только про атомарность.
+
источник

N

Nikolay in DBA - русскоговорящее сообщество
Ilia Zviagin
Ты это про распределённые транзакции, видимо. А сначала ты про 2PC спрашивал.
commit двух вазный, он же как часть транзакции. вот я как бы подразумеваю, что должны все свойства транзакций соблюдаться при таком коммите. может и не стоит делать таких ожидания?. но почему?
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Nikolay
почему? если у меня 2 системы. Допустим, что в одной системе, я записываю 1 insert, а в другой другой инсерт. всего у меня 2 Insert. Т.е должен я увидеть сразу 2 строки. А так получается, что я могу их проверить и увижу только 1... а потом через какое-то время увижу уже 2.
Это какой-то непонятный пример.
В 2PC транзакция с одного узла распространяется на другие. Т.е. у неё нет независимых частей в разных системах.
источник

N

Nikolay in DBA - русскоговорящее сообщество
Yaroslav Schekin
> А в случает 2PC выходит, что я могу это увидеть.

Не выходит. "Половину" транзакции Вы не увидите.

> в одной системе я увижу данные уже закомиченными, а в другой еще не.

Да, и это нормально.

> Т.е я увижу как раз тот самый progress транзакции .

Нет. Никакой "распределённой ACID транзакции" в 2PC нет, он именно и только про атомарность.
т.е нет как бы нет одной транзакции? это у меня 2 разные транзакции. выходит, что так?
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Nikolay
commit двух вазный, он же как часть транзакции. вот я как бы подразумеваю, что должны все свойства транзакций соблюдаться при таком коммите. может и не стоит делать таких ожидания?. но почему?
> вот я как бы подразумеваю

Не подразумевайте, протоколы и алгоритмы дают только формально заявленные гарантии, кофе не варят. ;)

> все свойства транзакций соблюдаться при таком коммите

Опять-таки, никакой распределённой транзакции тут нет.
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Nikolay
т.е нет как бы нет одной транзакции? это у меня 2 разные транзакции. выходит, что так?
Я не знаю, как выходит в неясном примере. Нужно конкретные приводить в таких случаях — подобные темы и так достаточно сложны.
источник

N

Nikolay in DBA - русскоговорящее сообщество
Yaroslav Schekin
> вот я как бы подразумеваю

Не подразумевайте, протоколы и алгоритмы дают только формально заявленные гарантии, кофе не варят. ;)

> все свойства транзакций соблюдаться при таком коммите

Опять-таки, никакой распределённой транзакции тут нет.
а можно ли тогда сделать распределенную транзакцию т.е транзакцию( когда несколько хостов, как в примере с этими 2мя инсертами). там ведь встанет этот же вопрос.
источник

ВТ

Виктор Ткаченко... in DBA - русскоговорящее сообщество
Yaroslav Schekin
> вот я как бы подразумеваю

Не подразумевайте, протоколы и алгоритмы дают только формально заявленные гарантии, кофе не варят. ;)

> все свойства транзакций соблюдаться при таком коммите

Опять-таки, никакой распределённой транзакции тут нет.
Все это ближе к репликации с гарантией доставки, чем к транзакции как таковой
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Nikolay
а можно ли тогда сделать распределенную транзакцию т.е транзакцию( когда несколько хостов, как в примере с этими 2мя инсертами). там ведь встанет этот же вопрос.
Да, но для этого используются уже распределённые СУБД, т.е. одного только протокола atomic commit для этого недостаточно.
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
Виктор Ткаченко
Все это ближе к репликации с гарантией доставки, чем к транзакции как таковой
В общем, да (хотя не совсем то же самое).
источник