mySQL TSQLTransaction указать уровень изоляции

Модератор: Модераторы

Ответить
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

mySQL TSQLTransaction указать уровень изоляции

Сообщение RustemNur »

Доброго времени!
Не могу найти, как корректно указать уровень изоляции транзакции mySQL в компоненте TSQLTransaction.
В свойстве Params перепробовал самые разные варианты а-ля
transaction_isolation = READ-COMMITTED
- никак не могу заставить запрос увидеть новые изменения в БД без перезапуска транзакции, и нигде не могу найти, как это правильно пишется.
Прошу помощи, заранее благодарен.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

mySQL не всегда поддерживает транзакции.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Сообщение RustemNur »

mySQL не всегда поддерживает транзакции.

Спасибо.
Как бы там ни было хотелось бы знать правильный механизм указания уровня изоляции.
Для начала я прав, что это указывается в свойстве SQLTransaction.Params ?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

SQLTransaction1.Action. Обычно для mySQL устанавливается в caCommitRetaining.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Сообщение RustemNur »

Спасибо.

CommitRetaining - это все-таки нечто другое ...
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

read commited это уровень изоляции по умолчанию для практически любой СУБД. Чтобы увидеть изменения в текущей транзакции, надо сделать commit, очевидно.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Сообщение RustemNur »

Mirage писал(а):read commited это уровень изоляции по умолчанию для практически любой СУБД.

Официальное руководство по MySQL 5.7 с вами не согласно:
The default isolation level for InnoDB is REPEATABLE READ.

Кроме того, насколько я помню, для Firebird по умолчанию уровень snapshot, хотя, возможно, уже что-то и поменялось.
Про другие не скажу.
Mirage писал(а): Чтобы увидеть изменения в текущей транзакции, надо сделать commit, очевидно

Что-то совсем не очевидно, простите. Оно на то и read commited, чтобы в текущей активной транзакции видеть подтвержденные в других транзакциях изменения.
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

RustemNur писал(а):Кроме того, насколько я помню, для Firebird по умолчанию уровень snapshot, хотя, возможно, уже что-то и поменялось.

Для утилиты isql, не для fb.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

RustemNur писал(а):Официальное руководство по MySQL 5.7 с вами не согласно:
The default isolation level for InnoDB is REPEATABLE READ.



Ну у этих все не как у людей. На помойку.

RustemNur писал(а):Что-то совсем не очевидно, простите. Оно на то и read commited, чтобы в текущей активной транзакции видеть подтвержденные в других транзакциях изменения.


Ну да, подтвержденные это и есть commited.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

RustemNur,
есть в MySQL большая разница между тем, выполняете ли вы несколько запросов в одной сессии, или в разных. Если в разных, то у вас select будет читать только commited записи, хоть тресни. А вот в одной и той же сессии можно, играя уровнем transaction_isolation прочитать и не скомитченые записи. По мне, так это совершенно ненужная фича. Тем более, что я работаю обычно с MyISAM engine, где никаких транзакций нет в принципе.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Сообщение RustemNur »

Снег Север, не о read uncommited речь идет.
В рамках той идеологии, которую реализует Дельфи/Лазарус, когда для каждого компонента - набора данных нужно указать компонент - транзакцию, приходится для каждого (немного утрирую) набора данных "бросать" на модуль данных и отдельный компонент - транзакцию, т.к. необходимость коммитить читающую транзакцию для выявления новых интересующих данных приведет к тому, что закроются все НД, которые "сидят" на этой транзакции. Тупо появляется много "ненужных" компонентов, не говоря уже о "напрягах" для сервера БД, который ведет кучку транзакций типа REPEATABLE READ.

ЗЫ: на форумах я привык, когда ко мне обращаются на "ты", так что, если не трудно
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Я так и не понял проблемы... Тебе нужен один connection и один transaction. SQLTransaction1.Action устанавливается в caCommitRetaining. Это делается в отдельном модуле. Все формы со всеми своими query работают с ним. Всё. После этого все изменения комитются автоматом. А для чтения ничего вообще не надо выставлять, кроме того, что идет по умолчанию. У меня на работе десятки приложений работают по этой схеме прекрасно.
После транзакции ничего не закрывается, если специально не закрыл connection. И, разумеется, для чтения обновленных данных надо делать refresh dataset'а.
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Сообщение RustemNur »

Снег Север, да, может быть с caCommitRetaining датасеты не закроются - я до сих пор не пользовал его, т.к. разработчики FB сильно нехорошо о нем отзывались применительно к своему серверу, и так у меня это и отложилось в голове.
И тем не менее, держать на чтение открытой долгую транзакцию REPEATABLE READ - это довольно сомнительный подход ...
И да, спасибо за ответы. Только вот как назначить уровень изоляции, я так и не выяснил ...
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

RustemNur, mysql и fb работают очень по-разному. Если вы к чему-то привыкли на fb, то на mysql от этом забудьте... :D
Принцип работы аппликации с mysql - немедленные коммиты, если у вас innodb или вообще никаких, если myisam. И закрывать соединение только с концом работы аппликации. Все эти уровни изоляции - ересь... :D
Ответить