powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / вопрос по логике транзкации
21 сообщений из 21, страница 1 из 1
вопрос по логике транзкации
    #39759772
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Допустим стартовала транзакция 1. И в все. просто стартовала.

Потом стартовала транзакция 2. и пошла по большой таблице процедурой. Допустим ведущая таблица Table1 с 100 млн строк.
Работает долго. Допустим суммирует что то из ведущей таблицы и потом еще что то делает. Дошла до миллионной строки.

И тут в первой транзакции прошел update одной записи в table1. который допустим пришелся на 100 тысячную строку. те на ту строку, которую процедура во второй транзакции уже обработала. Ну и первая транзакция закоммитилась.
Получается в 2 транзакции будет недостоверная информация?


И еще такой вопрос. а что происходит при commit? Сброс на диск страниц. только как транзакция знает какие страницы сбрасывать? получается при массовом update например транзакция в каком то буфере дополнительном запоминает какие страницы затрагивала и какие номера записей?
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759774
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чти: http://www.ibase.ru/transactions/
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759777
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLПотом стартовала транзакция 2.С каким уровнем изолированности она стартовала?
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759779
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Налицо непонимание базовых принципов работы, чем отличается "снапшот" транзакция от "рид коммитед".
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759811
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky, "Не материс!" (c) CW
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759817
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLИ тут в первой транзакции прошел update одной записи в table1. который допустим пришелся на 100 тысячную строку. те на ту строку, которую процедура во второй транзакции уже обработала. Ну и первая транзакция закоммитилась.
Получается в 2 транзакции будет недостоверная информация?

зависит от уровня изолированности транзакции 2. если snapshot (concurrency), то никаких изменений она не увидит.
Если read committed, то увидит, и так и положено.
А если коммит транзакции 1 произошел ПОСЛЕ чтения обновленной записи транзакцией 2, то транзакция 2 увидит старую версию, независимо от своего уровня изолированности. Потому что не-коммиттед версию видеть может только транзакция, которая эту версию и создала.

Есть еще нюанс - если транзакция 2 читает данные одним запросом, то в Firebird 3 будут прочитаны консистентные данные, т.е. всё равно, транзакция 1 делала коммит, или нет, даже если транзакция 2 в read committed.
Это т.н. "стабильность курсора".
Если же запросы в транзакции 2 разные, то да, в read committed могут вернуться "неконсистентные" данные, так на то оно и read committed.
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759835
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЕсть еще нюанс - если транзакция 2 читает данные одним запросом, то в Firebird 3 будут прочитаны консистентные данные, т.е. всё равно, транзакция 1 делала коммит, или нет, даже если транзакция 2 в read committed.
Это т.н. "стабильность курсора".
Если же запросы в транзакции 2 разные, то да, в read committed могут вернуться "неконсистентные" данные, так на то оно и read committed.


нет стабильность курсора это про данные которые изменяются в той же транзакции для курсора. И оно не зависит от уровня изолированности. (Всякие там INSERT INTO table SELECT * FROM table). Это действительно исправлено в 3.0

А то о чём ты говоришь это согласованность чтения на уровне оператора в RC, это только в 4.0 исправлено
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759913
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

ок, попутал.
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759942
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot kdv]AndrewVLА если коммит транзакции 1 произошел ПОСЛЕ чтения обновленной записи транзакцией 2, то транзакция 2 увидит старую версию, независимо от своего уровня изолированности. Потому что не-коммиттед версию видеть может только транзакция, которая эту версию и создала.

.

Транзакции обе read committed.
Я б сказал иначе. Коммит первой и стейтмент на обновление произошел после того, как вторая транзакция прочитала первую версию записи, обновленной в первой транзакции.

Если совсем на пальцах. Первая транзакция отдыхает. Вторая медленно бежит по большой странице и считает сумму колонки K. Добежав до миллионной строки первая транзакция запускает стейтмент и изменяет K 100 тысячной записи. Те той, которую первая уже обработала и посчитала в сумму. Commit первой.
Понятно, что придя во второй транзакции до миллионной строки и обновив поле К в двухмиллионной строке и закомиттив в первую транзакцию, вторая увидит это изменение. Тк выполненение стейтмента банально до него не дошло. Я спрашивал про обратный случай
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759944
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спешу.

Те той, которую ВТОРАЯ уже обработала и посчитала в сумму. Commit первой.
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759948
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первая то стартовала раньше второй. Но завершилась позже
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759951
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVL,

кто тебе мешает использовать правильный уровень изолированности для отчётов?
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39759973
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLЕсли совсем на пальцах.

Пока не прочитаешь всё по приведённой мною ссылке, свои пальцы оставь в покое,
пересказывать тебе букварь не так забавно, как некоторым кажется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39760015
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLЕсли совсем на пальцах.

я про это объяснял 14 лет назад, в 2005 году
1449269
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39760016
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVL,

вернее, даже вот отсюда надо читать - 1447129
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39760411
Roman Simakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В транзакции 2 будет достоверная информация если она в снапшотной изоляции или в Firebird 4.0. Там каждый запрос в собственном снапшоте! Потестируй, сравни с 3.0 и расскажи результаты.
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39761852
AndrewVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно) может потом что щёлкнет в голове и все с сне. На место.

Приведу ещё один пример. (Read committed) Есть длинная полка с книгами. Библиотекарь решил с неё убрать пару Книг , но сначала решил попить чая(первая транзакция) А тут простой читатель так же read commited решил эти книги ну например пересчитать. Идёт по полке, считает . Насчитал уже 1000 книг. И тут библиотекарь проснулся и решил забрать две книги и пойти домой (commit ). В итоге читатель насчитал 1000 книг . А на момент его commit на полке все ж 998 книг . И пока он не пересчитаете не будет иметь достоверной инфы.
Все в стандартной read commited. Ну по идее так и должно быть. Только повторный пересчёт даст достоверный результат.

Ладно . Скажите кто нибудь что на физическо-логическом уровне есть commit.
Тут в качестве эксперимента сделал процедуру которая вставляет 30 млн записей в таблицу вида integer,small,char10,integer. В простом цикле. Справилась она за чуть больше 2 минут. Скорость записи на диск в районе 30 метров. Понятно, что она в это время формировала dp и pp соответствующей таблицы и (наверно) добавляла их для начала в кэш. И в момент заполнения кэша сбрасывала все на диск. Удивила относительно равномерная ,скорость записи на диск. Есть же промежуток (наверно) между временем заполнения кэша и началом его сброса. И судя по статистике потребила эта процедура в районе 500 метров памяти. На что?
Да, и все ж что есть на логическом уровне коммит?
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39761855
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLСкажите кто нибудь что на физическо-логическом уровне есть commit.Я не знаю, но всегда подозревал, что коммит - это установка битика в определенный байтик с параметрами транзакции.
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39761872
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLИ в момент заполнения кэша сбрасывала все на диск.

это не верное предположение.

Твой пример с полками тоже не корректный. Ещё раз в RC транзакции статмент даёт достоверный результат на момент своего старта (до 4.0 это не совсем так но твой пример с книгами это не демонстрирует).
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39761889
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLДа, и все ж что есть на логическом уровне коммит?
коммит - это одно из 4х состояний транзакций в двух битах состояния транзакции в transaction inventory pages.
http://www.ibase.ru/mga/
YouTube Video
...
Рейтинг: 0 / 0
вопрос по логике транзкации
    #39761906
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewVLЛадно) может потом что щёлкнет в голове и все с сне. На место.

Приведу ещё один пример. (Read committed) Есть длинная полка с книгами. Библиотекарь решил с неё убрать пару Книг , но сначала решил попить чая(первая транзакция) А тут простой читатель так же read commited решил эти книги ну например пересчитать. Идёт по полке, считает . Насчитал уже 1000 книг. И тут библиотекарь проснулся и решил забрать две книги и пойти домой (commit ). В итоге читатель насчитал 1000 книг . А на момент его commit на полке все ж 998 книг . И пока он не пересчитаете не будет иметь достоверной инфы.
Все в стандартной read commited. Ну по идее так и должно быть. Только повторный пересчёт даст достоверный результат.

Душа моя. А по жизни, не в программе, какой есть способ узнать, что за спиной у тебя, считающего, кто-то не потырил уже сосчитанную книжку с полки? Святой Дух обычно сильно занят более значимыми и для человечества и для Мироздания в целом проблемами и кричать - оглянись! - ему каждому считателю некогда. Так же и в ей, в программе. Теперь - а что такое достоверная инфа в нашем непрерывно и быстро меняющемся мире? Она может быть достоверной только на какой-то момент времени. Весь вопрос - на какой. И вот тут-то и появляется Диавол, кроющийся, как известно, в деталях.

Что есть коммит. В Firebird вообще нет понятия текущего состояния ни записи, ни отношения (таблицы в целом, ибо она состоит из записей). Есть цепочки версий записи и транзакции видят те версии, которые им положено исходя из уровня изоляции. Не во всех SQL-серверах решение проблемы достоверности на некоторый момент такое, потому и говорю - в Firebird. Зачем так?

Дело в том, что в реляционной модели представление описаний объектов реального мира, как правило, размазано по нескольким таблицам, содержащим описания взаимосвязанных сущностей, составляющих этот объект. То есть, описание объекта - это не запись, а гроздь записей, и частенько при изменении одной надо что-то поменять и в других, и только тогда описание объекта будет непротиворечивым и целостным. Классический упрощённый бытовой пример - накладная. Заголовок и состав. Это не считая справочников, на которые они ссылаются. Транзакция меняет состав (изменяет количество, добавляет, удаляет) и финальным аккордом транслирует суммарные данные в заголовок - читающие в это время видят старое состояние. Целостное. Всё сделала, говорит - всё, пи... тьфу, коммит. С этого момента read_commited транзакции видят это состояние объекта, хотя в то же самое время его может менять неспешно-постепенно другая пишущая транзакция. А вот concurrency транзакции всё равно видят то состояние, которое было на момент их старта. Зачем так?

Вернёмся к примитиву с накладной. Наша пишущая транзакция добавила запись в состав, подправила суммарный тоннаж в заголовке, в это время читающая read_commited прочитала заголовок (с данными предыдущей версии), наша закоммитилась, читающая прочитала состав и фигню получила практицки. В заголовке 10 кило, в составе 12.


Из пункта А в пункт Б вышел товарный поезд со скоростью 45 кмч.
Из пункта Б в пункт А вышел пассажирский поезд со скоростью 80 кмч.
Оба поезда своевременно прибыли в пункты назначения.
Почему же они не встретились по дороге?

Не судьба...


А читающая concurrency получила состояние 10 и 10. Целостное на момент её старта. Не актуальное в сию секунду? Говно вопрос. Если пользователь позырил и успокоился, то какая разница, а если полезет менять - получит отлуп, в смысле конфликт - данные, любые, в записи в любой таблице, которую эта транзакция попытается изменить, были изменены после её старта. Перечитает и скажет - аааа... И отчёты на больших объёмах данных на какой-то момент времени тоже делаются в concurrency, чтобы они были непротиворечивы что на уровне вглыбь по каждой позиции, что в длину по списку позиций на момент времени начала их, отчётов в смысле, составления. Поменять ведь могут за время работы не только сзади читающей головки, но и впереди, что ценность отчёта сводит к нулю - непонятно какая позиция к какому моменту времени относится. Слова "прямо сейчас" - бессмыслица по определению в многопользовательской среде.

Вернёмся к нашим баранам, в смысле чтению списка. А какая разница, что он не совсем соответствует сиюминутному состоянию? Он нужен зачем? Просто так - да и фиг с ним. Выбрать позицию и поработать с ней? Так надо стартовать транзакцию для работы с этой позицией и перечитать её первым шагом, увидеть актуальное на этот момент состояние. Или ни хрена не увидеть если к моменту принятия решения на редактирование эту позицию удалили и закоммитили удаление. И дальше при внесении изменений получить отлуп если кто-то полез в эту же позицию параллельно и успел что-то поменять первым. Или принять меры к тому, чтобы он этого сделать не смог. Что удобно, но чревато. Но это уже другая история.

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


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