|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Здравствуйте. Допустим стартовала транзакция 1. И в все. просто стартовала. Потом стартовала транзакция 2. и пошла по большой таблице процедурой. Допустим ведущая таблица Table1 с 100 млн строк. Работает долго. Допустим суммирует что то из ведущей таблицы и потом еще что то делает. Дошла до миллионной строки. И тут в первой транзакции прошел update одной записи в table1. который допустим пришелся на 100 тысячную строку. те на ту строку, которую процедура во второй транзакции уже обработала. Ну и первая транзакция закоммитилась. Получается в 2 транзакции будет недостоверная информация? И еще такой вопрос. а что происходит при commit? Сброс на диск страниц. только как транзакция знает какие страницы сбрасывать? получается при массовом update например транзакция в каком то буфере дополнительном запоминает какие страницы затрагивала и какие номера записей? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 14:20 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Чти: http://www.ibase.ru/transactions/ Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 14:23 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
AndrewVLПотом стартовала транзакция 2.С каким уровнем изолированности она стартовала? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 14:25 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Налицо непонимание базовых принципов работы, чем отличается "снапшот" транзакция от "рид коммитед". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 14:27 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, "Не материс!" (c) CW ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 15:04 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 15:10 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
kdvЕсть еще нюанс - если транзакция 2 читает данные одним запросом, то в Firebird 3 будут прочитаны консистентные данные, т.е. всё равно, транзакция 1 делала коммит, или нет, даже если транзакция 2 в read committed. Это т.н. "стабильность курсора". Если же запросы в транзакции 2 разные, то да, в read committed могут вернуться "неконсистентные" данные, так на то оно и read committed. нет стабильность курсора это про данные которые изменяются в той же транзакции для курсора. И оно не зависит от уровня изолированности. (Всякие там INSERT INTO table SELECT * FROM table). Это действительно исправлено в 3.0 А то о чём ты говоришь это согласованность чтения на уровне оператора в RC, это только в 4.0 исправлено ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 15:32 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Симонов Денис, ок, попутал. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 17:24 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
[quot kdv]AndrewVLА если коммит транзакции 1 произошел ПОСЛЕ чтения обновленной записи транзакцией 2, то транзакция 2 увидит старую версию, независимо от своего уровня изолированности. Потому что не-коммиттед версию видеть может только транзакция, которая эту версию и создала. . Транзакции обе read committed. Я б сказал иначе. Коммит первой и стейтмент на обновление произошел после того, как вторая транзакция прочитала первую версию записи, обновленной в первой транзакции. Если совсем на пальцах. Первая транзакция отдыхает. Вторая медленно бежит по большой странице и считает сумму колонки K. Добежав до миллионной строки первая транзакция запускает стейтмент и изменяет K 100 тысячной записи. Те той, которую первая уже обработала и посчитала в сумму. Commit первой. Понятно, что придя во второй транзакции до миллионной строки и обновив поле К в двухмиллионной строке и закомиттив в первую транзакцию, вторая увидит это изменение. Тк выполненение стейтмента банально до него не дошло. Я спрашивал про обратный случай ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 17:58 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
спешу. Те той, которую ВТОРАЯ уже обработала и посчитала в сумму. Commit первой. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 18:01 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Первая то стартовала раньше второй. Но завершилась позже ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 18:09 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
AndrewVL, кто тебе мешает использовать правильный уровень изолированности для отчётов? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 18:17 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
AndrewVLЕсли совсем на пальцах. Пока не прочитаешь всё по приведённой мною ссылке, свои пальцы оставь в покое, пересказывать тебе букварь не так забавно, как некоторым кажется. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2019, 19:03 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
В транзакции 2 будет достоверная информация если она в снапшотной изоляции или в Firebird 4.0. Там каждый запрос в собственном снапшоте! Потестируй, сравни с 3.0 и расскажи результаты. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2019, 16:39 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
Ладно) может потом что щёлкнет в голове и все с сне. На место. Приведу ещё один пример. (Read committed) Есть длинная полка с книгами. Библиотекарь решил с неё убрать пару Книг , но сначала решил попить чая(первая транзакция) А тут простой читатель так же read commited решил эти книги ну например пересчитать. Идёт по полке, считает . Насчитал уже 1000 книг. И тут библиотекарь проснулся и решил забрать две книги и пойти домой (commit ). В итоге читатель насчитал 1000 книг . А на момент его commit на полке все ж 998 книг . И пока он не пересчитаете не будет иметь достоверной инфы. Все в стандартной read commited. Ну по идее так и должно быть. Только повторный пересчёт даст достоверный результат. Ладно . Скажите кто нибудь что на физическо-логическом уровне есть commit. Тут в качестве эксперимента сделал процедуру которая вставляет 30 млн записей в таблицу вида integer,small,char10,integer. В простом цикле. Справилась она за чуть больше 2 минут. Скорость записи на диск в районе 30 метров. Понятно, что она в это время формировала dp и pp соответствующей таблицы и (наверно) добавляла их для начала в кэш. И в момент заполнения кэша сбрасывала все на диск. Удивила относительно равномерная ,скорость записи на диск. Есть же промежуток (наверно) между временем заполнения кэша и началом его сброса. И судя по статистике потребила эта процедура в районе 500 метров памяти. На что? Да, и все ж что есть на логическом уровне коммит? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2019, 14:36 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
AndrewVLСкажите кто нибудь что на физическо-логическом уровне есть commit.Я не знаю, но всегда подозревал, что коммит - это установка битика в определенный байтик с параметрами транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2019, 14:50 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
AndrewVLИ в момент заполнения кэша сбрасывала все на диск. это не верное предположение. Твой пример с полками тоже не корректный. Ещё раз в RC транзакции статмент даёт достоверный результат на момент своего старта (до 4.0 это не совсем так но твой пример с книгами это не демонстрирует). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2019, 16:45 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
AndrewVLДа, и все ж что есть на логическом уровне коммит? коммит - это одно из 4х состояний транзакций в двух битах состояния транзакции в transaction inventory pages. http://www.ibase.ru/mga/ ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2019, 19:28 |
|
вопрос по логике транзкации
|
|||
---|---|---|---|
#18+
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, чтобы они были непротиворечивы что на уровне вглыбь по каждой позиции, что в длину по списку позиций на момент времени начала их, отчётов в смысле, составления. Поменять ведь могут за время работы не только сзади читающей головки, но и впереди, что ценность отчёта сводит к нулю - непонятно какая позиция к какому моменту времени относится. Слова "прямо сейчас" - бессмыслица по определению в многопользовательской среде. Вернёмся к нашим баранам, в смысле чтению списка. А какая разница, что он не совсем соответствует сиюминутному состоянию? Он нужен зачем? Просто так - да и фиг с ним. Выбрать позицию и поработать с ней? Так надо стартовать транзакцию для работы с этой позицией и перечитать её первым шагом, увидеть актуальное на этот момент состояние. Или ни хрена не увидеть если к моменту принятия решения на редактирование эту позицию удалили и закоммитили удаление. И дальше при внесении изменений получить отлуп если кто-то полез в эту же позицию параллельно и успел что-то поменять первым. Или принять меры к тому, чтобы он этого сделать не смог. Что удобно, но чревато. Но это уже другая история. Ну что, все мозги разбил на части, все извилины заплёл? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2019, 21:19 |
|
|
start [/forum/topic.php?fid=40&msg=39761889&tid=1560837]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
75ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 174ms |
0 / 0 |