Ответ Тома на вопрос о consistent write...
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
Ответ Тома на вопрос о consistent write...
...не заставил себя долго ждать. После бурной частной переписки в течение 3 дней и дополнительных запросов от Тома предоставить ему всё больше и больше подробностей, а также эмоциональных комментарев с дюжиной вопросительных и восклицательных знаков он наконец ответил официально на сайте. Вернее отписался. Но с пометкой "do not publish", т.е. его ответ не предназначен для общего просмотра. Поэтому эта страница не видна для других посетителей asktom.com.
Cheers
-
- Уже с Приветом
- Posts: 109
- Joined: 26 Sep 2002 12:24
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
Merle wrote:А небыло никаких намеков, мол попозже обмозгую и напишу? Или все, этот вопрос широкой общественности теперь никогда доступен не будет?
Не переживайте - ничего полезного, чего бы мы уже не знали или не предполагали, он не сказал. Я уже поместил свой вежливый по форме, но жёсткий по сути комментарий на его последний ответ-отписку. Посмотрим, будет ли продолжение.
Cheers
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
Том перестал отвечать окончательно... Поэтому я попробовал продолжить в usenet.
comp.databases.oracle.server - Single-statement 'write consistency' on read committed. Oh, really?
comp.databases.oracle.server - Single-statement 'write consistency' on read committed. Oh, really?
Cheers
-
- Уже с Приветом
- Posts: 109
- Joined: 26 Sep 2002 12:24
Спасибо, очень интересно почитать...
Но.. На сколько я понимаю, при Read committed уровне изоляции, версионнику, при изменении данных, достаточно дождаться пока другая транзакция перепишет запись и зафиксируется, потом прочитать новое значение и если оно удовлетворяет предикату - изменить, если нет, то не менять.
Зачем вообще Ораклу нужно делать откат? Транзакция в любом случае будет обновлять зафиксированные данные и с точки зрения формальной теории все в поряке.. Или я ошибаюсь?
Да statement concistency таким образом не получится, но RC этого и не требует...
Или Ораклу нужно делать эти миниоткаты, чтобы просто поменять метки транзакций в уже обновленных данных, так как могут возникнуть проблемы при последующих чтениях?
И еще такой вопрос немного в сторону. Если при уровне изоляции RC запрос натыкается на запись измененную и зафиксированную уже после его старта.. Он все равно берет версию данных на момент начала выполнения своего запроса или берет уже зафиксированную версию? Или все это зависит от конкретной реализации, а с формальной точки зрения оба случая будут RC?
Но.. На сколько я понимаю, при Read committed уровне изоляции, версионнику, при изменении данных, достаточно дождаться пока другая транзакция перепишет запись и зафиксируется, потом прочитать новое значение и если оно удовлетворяет предикату - изменить, если нет, то не менять.
Зачем вообще Ораклу нужно делать откат? Транзакция в любом случае будет обновлять зафиксированные данные и с точки зрения формальной теории все в поряке.. Или я ошибаюсь?
Да statement concistency таким образом не получится, но RC этого и не требует...
Или Ораклу нужно делать эти миниоткаты, чтобы просто поменять метки транзакций в уже обновленных данных, так как могут возникнуть проблемы при последующих чтениях?
И еще такой вопрос немного в сторону. Если при уровне изоляции RC запрос натыкается на запись измененную и зафиксированную уже после его старта.. Он все равно берет версию данных на момент начала выполнения своего запроса или берет уже зафиксированную версию? Или все это зависит от конкретной реализации, а с формальной точки зрения оба случая будут RC?
-
- Уже с Приветом
- Posts: 664
- Joined: 05 Jun 2002 01:11
Merle wrote:...
И еще такой вопрос немного в сторону. Если при уровне изоляции RC запрос натыкается на запись измененную и зафиксированную уже после его старта.. Он все равно берет версию данных на момент начала выполнения своего запроса или берет уже зафиксированную версию? Или все это зависит от конкретной реализации, а с формальной точки зрения оба случая будут RC?
It depends on what you mean by 'request'. If it's a select statement, then the version as of the moment the select started is used. If it's an update/delete, naturally, the current version will be used.
Rgds.
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
Merle wrote:Зачем вообще Ораклу нужно делать откат? Транзакция в любом случае будет обновлять зафиксированные данные и с точки зрения формальной теории все в поряке.. Или я ошибаюсь? Да statement concistency таким образом не получится, но RC этого и не требует...
Вот это и есть суть одного из вопросов, ответ от которого я хотел получить от Тома. Зачем вообще возиться с перезапусками, если всё равно есть случаи, когда они нужны, но по факту не делаются? Почему тогда не перезапускать всегда когда это нужно? И даже если согласиться с таким половинчатым решением - в чём его смысл? Какие пользовательские сценарии покрывает их решение? Почему это всё недокументировано?
Или Ораклу нужно делать эти миниоткаты, чтобы просто поменять метки транзакций в уже обновленных данных, так как могут возникнуть проблемы при последующих чтениях?
Нет, эти миниоткаты не меняют метку тразнакции - транзакция ведь одна и та же.
Если при уровне изоляции RC запрос натыкается на запись измененную и зафиксированную уже после его старта.. Он все равно берет версию данных на момент начала выполнения своего запроса или берет уже зафиксированную версию? Или все это зависит от конкретной реализации, а с формальной точки зрения оба случая будут RC?
Данные для обновления вне зависимости от реализации или уровня изоляции нужно брать всегда текущие (последние зафиксированные) иначе будут аномалии не разрешённые ни одним стандартным уровнем изоляции.
Cheers
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
tengiz wrote:...................Если при уровне изоляции RC запрос натыкается на запись измененную и зафиксированную уже после его старта.. Он все равно берет версию данных на момент начала выполнения своего запроса или берет уже зафиксированную версию? Или все это зависит от конкретной реализации, а с формальной точки зрения оба случая будут RC?
Данные для обновления вне зависимости от реализации или уровня изоляции нужно брать всегда текущие (последние зафиксированные) иначе будут аномалии не разрешённые ни одним стандартным уровнем изоляции.
А как же Оракл то поступает - берет текущие или на начало транзакции? А есть ли этому выбору теоритическое обоснование?
-
- Уже с Приветом
- Posts: 109
- Joined: 26 Sep 2002 12:24
zVlad wrote: А как же Оракл то поступает - берет текущие или на начало транзакции? А есть ли этому выбору теоритическое обоснование?
Естественно текущее, иначе от Lost Update'ов там было бы не отвертеться. Отсюда же и теоретическое обоснование. =)
Если для изменения брать не текущие данные, а на момент запроса, то можно нарваться на Lost update.
Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал..
-
- Уже с Приветом
- Posts: 109
- Joined: 26 Sep 2002 12:24
Нет, эти миниоткаты не меняют метку тразнакции - транзакция ведь одна и та же.
Я здесь, немного описАлся... Я имел ввиду не метку, а время транзакции. Я не знаю, каким образом Оракл определяет, что транзакция запущена раньше или позже, (как различает версии данных) И была мысль, что именно таким образом сдвигается один запрос относительно другого по времени.
Данные для обновления вне зависимости от реализации <...>
Да, это понятно, спасибо, но я в вопросе имел ввиду читающий запрос, а не пишущий..
Так, из области теоретических размышлений, на сколько корректным было бы брать уже зафиксированную версию...
Мне кажется, что вполне корректно, но по скольку брать версию на начало запроса не слишком накладно, но более согласованно, то большинство реализаций, в том числе и Оракл так и поступают..
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
Merle wrote:zVlad wrote: А как же Оракл то поступает - берет текущие или на начало транзакции? А есть ли этому выбору теоритическое обоснование?
Естественно текущее, иначе от Lost Update'ов там было бы не отвертеться. Отсюда же и теоретическое обоснование. =)
Если для изменения брать не текущие данные, а на момент запроса, то можно нарваться на Lost update.
Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал..
Merle wrote: "...Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал"
That's exactly why I was asking my questions. With update it is clear enough. I was asking (like you) keeping in my mind SELECT.
-
- Уже с Приветом
- Posts: 664
- Joined: 05 Jun 2002 01:11
zVlad wrote:Merle wrote:zVlad wrote: А как же Оракл то поступает - берет текущие или на начало транзакции? А есть ли этому выбору теоритическое обоснование?
Естественно текущее, иначе от Lost Update'ов там было бы не отвертеться. Отсюда же и теоретическое обоснование. =)
Если для изменения брать не текущие данные, а на момент запроса, то можно нарваться на Lost update.
Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал..
Merle wrote: "...Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал"
That's exactly why I was asking my questions. With update it is clear enough. I was asking (like you) keeping in my mind SELECT.
I thought I'd already answered this ...
But anyway, under the RCIL, the select is processed with the database "frozen" at the moment when the statement started; under the SIL, data is selected based on the timestamp when the whole transaction started (the first select or other statement).
Rgds.
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
vc wrote:zVlad wrote:Merle wrote:zVlad wrote: А как же Оракл то поступает - берет текущие или на начало транзакции? А есть ли этому выбору теоритическое обоснование?
Естественно текущее, иначе от Lost Update'ов там было бы не отвертеться. Отсюда же и теоретическое обоснование. =)
Если для изменения брать не текущие данные, а на момент запроса, то можно нарваться на Lost update.
Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал..
Merle wrote: "...Но я вопрос задавал не про insert/update/delete, а про select, просто как всегда не очень четко сформулировал"
That's exactly why I was asking my questions. With update it is clear enough. I was asking (like you) keeping in my mind SELECT.
I thought I'd already answered this ...
But anyway, under the RCIL, the select is processed with the database "frozen" at the moment when the statement started; under the SIL, data is selected based on the timestamp when the whole transaction started (the first select or other statement).
Rgds.
Sorry, vc. It was, actually, some sort of misleading (misunderstanding).
-
- Уже с Приветом
- Posts: 15311
- Joined: 30 Apr 2003 16:43
I have just discovered article regarding Multi Version on IBM side and want to share it with you guys (I don't read it myself yet but it probably could be worth to read):
ftp://ftp.software.ibm.com/software/dat ... stency.pdf
ftp://ftp.software.ibm.com/software/dat ... stency.pdf