powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Некомитнутые данные в сессии
19 сообщений из 19, страница 1 из 1
Некомитнутые данные в сессии
    #40071180
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос, который я решил с привлечением PL/SQL и возможно коряво, а хочется без PL/SQL и красиво.

Например я в sqlplus сессии, только что сделал апдейт одной таблицы по длинному критерию, вижу что апдейтнулось 5 строк.

Хочется посмотреть что именно готово записаться, увидеть разницу между commited и сессионной версиями таблицы.
Через SQL это просто, но зачем плодить код если можно вручную.

Сегодня попробую через SCN, пока не знаю какую лучше дать SCN. наверное текущую. нет опыта с флешбэками.

Это не покажет тавтологические изменения (когда апдейт был, но тем же значением), но меня это на данном этапе устраивает.
Я слышал про какой-то тул для анализа лога, который всю накопленную транзакцию умеет показать/расписать, но это мне надо.

Просто посмотреть что изменилось (собирается измениться) до коммита в текущей сессии. На другие я не замахиваюсь. Сессия в режиме commited reads, если это важно.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071194
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказалось все очень просто. Флеэбэк настоящего времени приравнивается к игнору некомитнутых данных сессии.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> update scott.emp set sal = sal+0.5 where ename like 'A%';

2 rows updated.

SQL> select * from scott.emp minus select * from scott.emp as of timestamp systimestamp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM    DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 20-FEB-81     1600.5        300        30

      7876 ADAMS      CLERK           7788 23-MAY-87     1100.5                   20

SQL>
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071196
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если великий Оракл умеет не только показывать прошлое(FLASHBACK), но и настоящее (FLASHNOW?),
то было бы странно не испытать его для будущего (FLASHFUTURE?). Все-таки имя продукта обязывает.

Ешкин кот, мой умеет! Но только на 6.5 секунд вперед, не более. Надеюсь, не испортил лицензию.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select * from scott.emp minus select * from scott.emp as of timestamp systimestamp+0.00007523;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM    DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 20-FEB-81     1600.5        300        30

      7876 ADAMS      CLERK           7788 23-MAY-87     1100.5                   20

SQL> select * from scott.emp minus select * from scott.emp as of timestamp systimestamp+0.00007524;
select * from scott.emp minus select * from scott.emp as of timestamp systimestamp+0.00007524
                    *
ERROR at line 1:
ORA-08186: invalid timestamp specified
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071197
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
TIMESTAMP_TO_SCN TIMESTAMP_TO_SCN takes as an argument a timestamp value and returns the approximate system change number (SCN) associated with that timestamp. The returned value is of data type NUMBER. This function is useful any time you want to know the SCN associated with a particular timestamp.

Note:The association between an SCN and a timestamp when the SCN is generated is remembered by the database for a limited period of time. This period is the maximum of the auto-tuned undo retention period, if the database runs in the Automatic Undo Management mode, and the retention times of all flashback archives in the database, but no less than 120 hours. The time for the association to become obsolete elapses only when the database is open. An error is returned if the timestamp specified for the argument to TIMESTAMP_TO_SCN is too old.
вопрос по SCN + FlashBack

Код: plsql
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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
with 
function f_timestamp_to_scn(p1 timestamp) return number
as
begin
    return timestamp_to_scn(p1);
exception when others then 
    return 0;
end;
function f_scn_to_timestamp(p1 number) return timestamp
as
begin
    return scn_to_timestamp(p1);
exception when others then 
    return null;
end;
t as (
    select 
        systimestamp stmp, 
        systimestamp+numtodsinterval(level-10, 'second') tstmp
    from dual 
    connect by level<=20
)
select 
   t.*
  ,f_timestamp_to_scn(tstmp) s1
  ,f_scn_to_timestamp(f_timestamp_to_scn(tstmp)) s2
from t;
/
SQL> ;
  1  with
  2  function f_timestamp_to_scn(p1 timestamp) return number
  3  as
  4  begin
  5      return timestamp_to_scn(p1);
  6  exception when others then
  7      return 0;
  8  end;
  9  function f_scn_to_timestamp(p1 number) return timestamp
 10  as
 11  begin
 12      return scn_to_timestamp(p1);
 13  exception when others then
 14      return null;
 15  end;
 16  t as (
 17      select
 18          systimestamp stmp,
 19          systimestamp+numtodsinterval(level-10, 'second') tstmp
 20      from dual
 21      connect by level<=20
 22  )
 23  select
 24     t.*
 25    ,f_timestamp_to_scn(tstmp) s1
 26    ,f_scn_to_timestamp(f_timestamp_to_scn(tstmp)) s2
 27    ,(select current_scn from v$database) curscn
 28  from t
 29*
SQL> /

STMP                              TSTMP                                          S1 S2                                    CURSCN
--------------------------------- -------------------------------------- ---------- --------------------------------- ----------
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:12.231174000 +00:00      3272542 2021-05-18 22:22:12.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:13.231174000 +00:00      3272542 2021-05-18 22:22:12.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:14.231174000 +00:00      3272542 2021-05-18 22:22:12.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:15.231174000 +00:00      3272543 2021-05-18 22:22:15.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:16.231174000 +00:00      3272543 2021-05-18 22:22:15.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:17.231174000 +00:00      3272543 2021-05-18 22:22:15.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:18.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:19.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:20.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:21.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:22.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:23.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:24.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:25.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:26.231174000 +00:00      3272544 2021-05-18 22:22:18.000000000        3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:27.231174000 +00:00            0                                      3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:28.231174000 +00:00            0                                      3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:29.231174000 +00:00            0                                      3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:30.231174000 +00:00            0                                      3272546
2021-05-18 22:22:21.231174 +00:00 2021-05-18 22:22:31.231174000 +00:00            0                                      3272546

20 rows selected.


SQL> select scn,time_dp from SYS.SMON_SCN_TIME order by time_dp desc fetch first 5 rows only;

       SCN TIME_DP
---------- -------------------
   3256505 2021-05-18 21:32:45
   3256328 2021-05-18 21:28:06
   3256167 2021-05-18 21:22:45
   3256033 2021-05-18 21:18:09
   3255591 2021-05-18 21:12:45


ps. Ни чтения доки, ни поиска по форуму, ни понимания принципов...
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071208
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имейте совесть (и немного чувства юмора), не осилить мне столько строчек перед сном.

Вы хоть намекните какую проблему пытаетесь решить.

Если помочь мне выбрать SCN для флэшбэка, то это давно не нужно, флешбэк timestamp тоже принимает, конвертация вряд ли полезна, разве что потеряете где-то до 3х секунд точности.

Но если бы не было уверенности что Оракл свою же systimestamp не воспримет как "самое новое",
то пару вариантов возможны: SCN последнего обновления интересующей таблицы, или просто текущий SCN системы.
Второй проще и быстрее.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071210
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вторая фаза: после исполнения

Код: plsql
1.
update scott.emp set sal = sal where ename > 'R';


безымянная транзакция началась, но изменений (данных) не случилось.
Триггеры исполнились, если были. Может, какие-то локи случились. Может, не случились.

Что в такой ситуации можно накопать про природу незаконченной транзакции,
не прибегая к специализированным тулзам? Asking for a friend :)
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071217
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Что в такой ситуации можно накопать про природу незаконченной транзакции,
Если не тролль, то спроси внятно.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071259
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Что в такой ситуации можно накопать про природу незаконченной транзакции


НеофитSQL
Вы хоть намекните какую проблему пытаетесь решить.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071386
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
НеофитSQL
Что в такой ситуации можно накопать про природу незаконченной транзакции,
Если не тролль, то спроси внятно.


"Расскажи мне про Сингапур", была такая детская книжка.
Там тоже было трудно перечислить вещи, о которых не знаешь.

Я привел пример транзакции которая "пустая" в смысле обновления данных, т.е. я ожидаю что после commit пользовательские данные в таблице не изменятся. Эта транзакция касалась одной или более строк, поэтому триггеры сработали, если были.

Конкретный вопрос: что можно узнать от БД по поводу такой незаконченной транзакции?
Как commit для этой транзакции будет отличаться от rollback с точки зрения пользователя с не-DBA правами,
кроме возможного изменения значения некоторых псевдоколонок?

Надеюсь, так яснее.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071391
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что можно узнать от БД

Что нужно узнать?

Транзакция что-то изменила или не изменила. Сделан rollback. Другие пользователи не увидели изменений. Сделан commit - увидели. До коммита можно смотреть блокировки. Можно смотреть сессии, запросы, куча вьюх V$*.

Пока ваш вопрос абстрактен.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071413
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Я привел пример транзакции которая "пустая" в смысле обновления данных, т.е. я ожидаю что после commit пользовательские данные в таблице не изменятся. Эта транзакция касалась одной или более строк, поэтому триггеры сработали, если были.

Конкретный вопрос: что можно узнать от БД по поводу такой незаконченной транзакции?

Зависит от доступных инструментов, желания и квалификации.
Если нет ничего из перечисленного, то и узнать ничего нельзя.
Если же кое-что есть, то кое-что узнать можно.

Например, можно оценить, как много изменений произвела транзакция:
v$transaction (полезно, если решается вопрос жизни и смерти - что быстрее, убить "зависшую", попав на откат или дождаться завершения)

Если почитать доку, ссылку на которую я Вам давал в одном из соседних топиков, то можно посмотреть, какие блокировки по каким объектам держит транзакция:
v$lock

Если есть кушать-не-могу-какая потребность посмотреть, что именно потрогала транзакция - то можно воспользоваться LogMiner.

А, быть может, к Вас есть лицензия ГГ и сервер сконфигурирован как источник? Тогда можно добавить на интересующие таблицы подходящий для наблюдений режим supplemental logging и смотреть trail-файлы.

Много чего можно.
Вопрос - что именно нужно и для зачем оно Вам.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071416
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLНадеюсь, так яснее.

Нет. Практическую цель назови. Тупо посчитать количество изменённых транзакцией записей?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071443
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

> Транзакция что-то изменила или не изменила. Сделан rollback. Другие пользователи не увидели изменений. Сделан commit - увидели.
В книжке так и пишут про очевидные случаи.

Если транзакция не поменяла данные в таблице (set X=X), есть ли с точки зрения других пользователей разница между commit и rollback? С моей невысокой колокольни не видно. Может, materialized view где-то рассинхронизируется, или уведомления выстрелят? Или оракл сообразит что данные не изменились, и не станет дергаться?

Пытаюсь увидеть общую философию БД по поводу нулевых изменений, а не решить какой-то конкретный вопрос.
Пока разобрался только с началом транзакции и с триггерами.

Смотрю дальше:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> update scott.emp set deptno=null where 1=2;

0 rows updated.

SQL> select se.sid, ob.object_name, lo.locked_mode
  2    from v$session se
  3   join v$locked_object lo on se.sid=lo.session_id
  4   join dba_objects ob using(object_id);

       SID  OBJECT_NAME LOCKED_MODE
--------------------------------------------------------------------------------
         2    DEPT          3
         2    EMP           3

SQL> rollback;

Rollback complete.



Локи на двух таблицах. На emp, которую упомянул но не изменил, и на dept. У emp есть FK на dept (без индекса), но я думал что блокирование таблиц из-за FK происходит в другую сторону.

Сейчас разбираюсь как посмотреть насколько конкретные эти локи. На всю таблицу, ждущую ноль изменений? Или построчные, на ноль строчек? Тема пока не раскрыта.

А вот "бесполезный" select-for-update блокирует только одну таблицу.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select * from scott.emp where 1=2 for update;

no rows selected

SQL> select se.sid, ob.object_name, lo.locked_mode
  2    from v$session se
  3   join v$locked_object lo on se.sid=lo.session_id
  4   join dba_objects ob using(object_id);

       SID  OBJECT_NAME LOCKED_MODE
--------------------------------------------------------------------------------
         2    EMP           3
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071444
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLНадеюсь, так яснее.

Нет. Практическую цель назови. Тупо посчитать количество изменённых транзакцией записей?


Там ноль, по определению.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071452
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLТам ноль, по определению.

То есть практической цели у топика нет, чисто на "покопаться в непонятной фигне".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071460
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и не понял, что нужно автору.

Может быть select * from flashback_transaction_query where xid = xid из v$transaction ?
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071472
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

То есть практической цели у топика нет, чисто на "покопаться в непонятной фигне".


Если бы я доверял незнакомым Сибиряковам решать рабочие задачи, у меня были бы совсем другие проблемы :)

Да, я копаюсь в непонятной фигне, т.к. хобби. "А что этот проводок делает?" "А почему эта трубка никуда не ведет?"

Фокус не на задаче, а на инструменте, поэтому туннельным зрением не страдаю.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071477
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
update scott.emp set sal=sal where 1=2 -- блокирует одну таблицу

update scott.emp set deptno=deptno where 1=2 -- блокирует две таблицы, из-за упоминания столбца с FK на scott.dept.

select deptno from scott.emp where 1=2 for update -- блокирует только одну, emp. упоминание deptno не пугает Оракл

insert into scott.emp(empno) select null from dual where dummy='test' -- блокирует две, хоть и не меняет таблицу



Пока не разобрался на чем именно стоят локи, смотрю на v$locked_object который упоминает таблицы в целом.
...
Рейтинг: 0 / 0
Некомитнутые данные в сессии
    #40071764
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Dimitry Sibiryakov

Нет. Практическую цель назови. Тупо посчитать количество изменённых транзакцией записей?
Там ноль, по определению.

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


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