mySQL TSQLTransaction указать уровень изоляции
Модератор: Модераторы
mySQL TSQLTransaction указать уровень изоляции
Доброго времени!
Не могу найти, как корректно указать уровень изоляции транзакции mySQL в компоненте TSQLTransaction.
В свойстве Params перепробовал самые разные варианты а-ля
transaction_isolation = READ-COMMITTED
- никак не могу заставить запрос увидеть новые изменения в БД без перезапуска транзакции, и нигде не могу найти, как это правильно пишется.
Прошу помощи, заранее благодарен.
Не могу найти, как корректно указать уровень изоляции транзакции mySQL в компоненте TSQLTransaction.
В свойстве Params перепробовал самые разные варианты а-ля
transaction_isolation = READ-COMMITTED
- никак не могу заставить запрос увидеть новые изменения в БД без перезапуска транзакции, и нигде не могу найти, как это правильно пишется.
Прошу помощи, заранее благодарен.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
mySQL не всегда поддерживает транзакции.
mySQL не всегда поддерживает транзакции.
Спасибо.
Как бы там ни было хотелось бы знать правильный механизм указания уровня изоляции.
Для начала я прав, что это указывается в свойстве SQLTransaction.Params ?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
SQLTransaction1.Action. Обычно для mySQL устанавливается в caCommitRetaining.
Спасибо.
CommitRetaining - это все-таки нечто другое ...
CommitRetaining - это все-таки нечто другое ...
Mirage писал(а):read commited это уровень изоляции по умолчанию для практически любой СУБД.
Официальное руководство по MySQL 5.7 с вами не согласно:
The default isolation level for InnoDB is REPEATABLE READ.
Кроме того, насколько я помню, для Firebird по умолчанию уровень snapshot, хотя, возможно, уже что-то и поменялось.
Про другие не скажу.
Mirage писал(а): Чтобы увидеть изменения в текущей транзакции, надо сделать commit, очевидно
Что-то совсем не очевидно, простите. Оно на то и read commited, чтобы в текущей активной транзакции видеть подтвержденные в других транзакциях изменения.
RustemNur писал(а):Кроме того, насколько я помню, для Firebird по умолчанию уровень snapshot, хотя, возможно, уже что-то и поменялось.
Для утилиты isql, не для fb.
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
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, где никаких транзакций нет в принципе.
есть в MySQL большая разница между тем, выполняете ли вы несколько запросов в одной сессии, или в разных. Если в разных, то у вас select будет читать только commited записи, хоть тресни. А вот в одной и той же сессии можно, играя уровнем transaction_isolation прочитать и не скомитченые записи. По мне, так это совершенно ненужная фича. Тем более, что я работаю обычно с MyISAM engine, где никаких транзакций нет в принципе.
Снег Север, не о read uncommited речь идет.
В рамках той идеологии, которую реализует Дельфи/Лазарус, когда для каждого компонента - набора данных нужно указать компонент - транзакцию, приходится для каждого (немного утрирую) набора данных "бросать" на модуль данных и отдельный компонент - транзакцию, т.к. необходимость коммитить читающую транзакцию для выявления новых интересующих данных приведет к тому, что закроются все НД, которые "сидят" на этой транзакции. Тупо появляется много "ненужных" компонентов, не говоря уже о "напрягах" для сервера БД, который ведет кучку транзакций типа REPEATABLE READ.
ЗЫ: на форумах я привык, когда ко мне обращаются на "ты", так что, если не трудно
В рамках той идеологии, которую реализует Дельфи/Лазарус, когда для каждого компонента - набора данных нужно указать компонент - транзакцию, приходится для каждого (немного утрирую) набора данных "бросать" на модуль данных и отдельный компонент - транзакцию, т.к. необходимость коммитить читающую транзакцию для выявления новых интересующих данных приведет к тому, что закроются все НД, которые "сидят" на этой транзакции. Тупо появляется много "ненужных" компонентов, не говоря уже о "напрягах" для сервера БД, который ведет кучку транзакций типа REPEATABLE READ.
ЗЫ: на форумах я привык, когда ко мне обращаются на "ты", так что, если не трудно
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Я так и не понял проблемы... Тебе нужен один connection и один transaction. SQLTransaction1.Action устанавливается в caCommitRetaining. Это делается в отдельном модуле. Все формы со всеми своими query работают с ним. Всё. После этого все изменения комитются автоматом. А для чтения ничего вообще не надо выставлять, кроме того, что идет по умолчанию. У меня на работе десятки приложений работают по этой схеме прекрасно.
После транзакции ничего не закрывается, если специально не закрыл connection. И, разумеется, для чтения обновленных данных надо делать refresh dataset'а.
После транзакции ничего не закрывается, если специально не закрыл connection. И, разумеется, для чтения обновленных данных надо делать refresh dataset'а.
Снег Север, да, может быть с caCommitRetaining датасеты не закроются - я до сих пор не пользовал его, т.к. разработчики FB сильно нехорошо о нем отзывались применительно к своему серверу, и так у меня это и отложилось в голове.
И тем не менее, держать на чтение открытой долгую транзакцию REPEATABLE READ - это довольно сомнительный подход ...
И да, спасибо за ответы. Только вот как назначить уровень изоляции, я так и не выяснил ...
И тем не менее, держать на чтение открытой долгую транзакцию REPEATABLE READ - это довольно сомнительный подход ...
И да, спасибо за ответы. Только вот как назначить уровень изоляции, я так и не выяснил ...
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
RustemNur, mysql и fb работают очень по-разному. Если вы к чему-то привыкли на fb, то на mysql от этом забудьте...
Принцип работы аппликации с mysql - немедленные коммиты, если у вас innodb или вообще никаких, если myisam. И закрывать соединение только с концом работы аппликации. Все эти уровни изоляции - ересь...
Принцип работы аппликации с mysql - немедленные коммиты, если у вас innodb или вообще никаких, если myisam. И закрывать соединение только с концом работы аппликации. Все эти уровни изоляции - ересь...
