Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,011

Получить доступ к таблице во время транзакции

20.02.2023, 10:26. Показов 1337. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

В MS SQL запускается основная процедура, которая открывает транзакцию и запускает субпроцедуры обновления. В этой основной процедуре между вызовами субпроцедурами стоит запись
SQL
1
2
--Процент увеличивается после каждой субпроцедуры
UPDATE test.StatusUpdate SET "Status" = 'Выполняется', "Percent_" = 10;
Если в какой либо субпроцедуре есть ошибка, то происходит ROLLBACK TRANSACTION.

Отдельно запускается запрос для получения текущего статуса транзакции.
SQL
1
SELECT [status_], [Percent_] FROM test.StatusUpdate WITH (NOLOCK)

В Postgres нет WITH (NOLOCK). Пишу так:
SQL
1
SELECT [status_], [Percent_] FROM test.StatusUpdate FOR UPDATE nowait
Не работает, когда открыта транзакция.

Скажите, как правильно написать, чтобы был доступ таблице test.StatusUpdate во время транзакции?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2023, 10:26
Ответы с готовыми решениями:

Возможно ли получить данные из БД во время выполнения транзакции
Добрый день. Ситуация такая: в коде я объявляю транзакцию и начинаю создавать запросы для обновления данных. Но в процессе, мне нужно так...

HtmlAgilityPack.dll, не получается получить доступ к таблице
/// <summary>Получить информацию о документе включающую его тип</summary> public DocumentInfo SearchSign(string fileName) ...

Как получить доступ к таблице переделанной из Lua в С++ ?
Прошу помощи, мучаюсь уже третий день, перепробовал и перечитал все что можно. В приложении, где исполняется код Lua есть встроенная...

6
106 / 67 / 29
Регистрация: 22.04.2022
Сообщений: 231
20.02.2023, 14:20
MS SQL - это "блокировочник", любой select блокирует таблицу или записи в таблице - поэтому почти везде нужно писать with (nolock).
Postgresql - "версионник", select ничего не блокирует. поэтому ситуация обратная там, где нужна блокировка пишем for update

Уберите for update nowait и будет Вам счастье
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,011
20.02.2023, 14:37  [ТС]
Цитата Сообщение от fte65 Посмотреть сообщение
Уберите for update nowait и будет Вам счастье
Если убрать, то выгружает строки, которые были до открытия транзакции. А нужны строки, которые записываются после субпроцедур. Это запрос для прогрессора.
0
106 / 67 / 29
Регистрация: 22.04.2022
Сообщений: 231
20.02.2023, 15:16
Цитата Сообщение от MConst Посмотреть сообщение
Если убрать, то выгружает строки, которые были до открытия транзакции
Всё правильно, а чего вы ожидаете? Делаете savepoint'ы...

Добавлено через 19 минут
Цитата Сообщение от MConst Посмотреть сообщение
Отдельно запускается запрос для получения текущего статуса транзакции.
Цитата Сообщение от MConst Посмотреть сообщение
Это запрос для прогрессора.
Ой, Вам наверное сюда
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
22.02.2023, 09:01
Цитата Сообщение от fte65 Посмотреть сообщение
MS SQL - это "блокировочник", любой select блокирует таблицу или записи в таблице - поэтому почти везде нужно писать with (nolock).
Не пишите ерунды.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,011
24.02.2023, 16:23  [ТС]
Такой код:

Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DROP PROCEDURE IF EXISTS test.procedure1();
DROP FUNCTION IF EXISTS test.getStatus();
DROP TABLE IF EXISTS test.StatusUpdate;
 
CREATE TABLE test.StatusUpdate
(
    "id" SMALLINT NOT NULL generated always AS IDENTITY (INCREMENT 1 START 1) PRIMARY KEY CHECK("id" = 1),
    "Status_" VARCHAR(20) NULL,
    "Percent_" SMALLINT NULL
);
--Всегда одна строка
INSERT INTO test.StatusUpdate("Status_", "Percent_") VALUES (NULL, NULL);
 
--Основная процедура обновления
CREATE PROCEDURE test.procedure1()
LANGUAGE PLPGSQL AS $$
BEGIN
    SET TRANSACTION isolation level READ committed;
    UPDATE test.StatusUpdate SET "Status_" = 'Выполняется', "Percent_" = 0;
    PERFORM pg_sleep(5);
    UPDATE test.StatusUpdate SET "Status_" = 'Выполняется', "Percent_" = 50;
    PERFORM pg_sleep(5);
    UPDATE test.StatusUpdate SET "Status_" = 'Завершено', "Percent_" = 100;
END;
$$
 
--Функция, которая получает текущий статус обновления основной процедуры
CREATE FUNCTION test.getStatus()
RETURNS TABLE ("Status_" VARCHAR(20), "Percent_" SMALLINT)
LANGUAGE PLPGSQL AS $$
BEGIN
    RETURN query
    SELECT t."Status_", t."Percent_" FROM test.StatusUpdate;
END;
$$;


В одном месте запускается:
SQL
1
2
3
do $$ BEGIN
    CALL test.procedure1();
END; $$;
В другом месте периодически запускается:
SQL
1
2
3
4
do $$ BEGIN
    --set transaction isolation level read uncommitted;
    SELECT * FROM test.getStatus();
END; $$;
В Postgres read uncommitted более строгая, чем в стандарте языка SQL. И он приравнивается уровню read committed. Получается, что теоретически не получится получать текущий статус во время запуска основной процедуры.

Скажите, раз в Postgres так устроено, то возможно как-то обойти, чтобы получать текущие статусы?
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
24.02.2023, 20:43
Вероятно здесь нужны "автономные транзакции".
Посмотрите на dblink, postgres_fdw, чтобы хоть как-то это дело сэмулировать.
Вообще поищите на эту тему расширения, может что-то еще подойдет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2023, 20:43
Помогаю со студенческими работами здесь

Как получить доступ к таблице в .mdb-файле
Не получается изменить данные в таблице Access, получается только извлечение данных. Подскажите, что не так?

Получить доступ к таблице GDT хотя бы для чтения
%include "io64.inc" ; синтаксис NASM section .data .gdtr: times 10 db 0x00 ; Первые два - размер GDT, следующие 4 - адрес начала...

Как получить доступ к содержимому ячеек в таблице на стороне сервера?
Таблица (HTML) построена так: <% For i = 0 to N %> <TR> <TD><asp:TextBox id='txtMeavteah' runat='server'...

Как можно получить доступ к отдельной таблице на страничке сайта
Есть страничка сайта http://abri.une.edu.au/online/cgi-bin/i4.dll?1=223D2B2A&2=2420&3=56&5=2B3C2B3C3A&6=5D5E5D235B272221&9=5A5D5A5D ...

Как во время выполнения на сервере страницы выводимой в один фрейм получить доступ к соседнему ?
Привет. Есть файл rez.htm в нем 2 фрейма frmy1 и frmy2 Результаты запроса к базе отображает myreq.asp в frmy1. Затем по запросу из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru