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

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

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

Сообщение RustemNur » 02.07.2018 08:43:33

Доброго времени!
Не могу найти, как корректно указать уровень изоляции транзакции mySQL в компоненте TSQLTransaction.
В свойстве Params перепробовал самые разные варианты а-ля
transaction_isolation = READ-COMMITTED
- никак не могу заставить запрос увидеть новые изменения в БД без перезапуска транзакции, и нигде не могу найти, как это правильно пишется.
Прошу помощи, заранее благодарен.
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

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

Сообщение Снег Север » 03.07.2018 08:21:42

mySQL не всегда поддерживает транзакции.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение RustemNur » 03.07.2018 09:49:46

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

Спасибо.
Как бы там ни было хотелось бы знать правильный механизм указания уровня изоляции.
Для начала я прав, что это указывается в свойстве SQLTransaction.Params ?
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

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

Сообщение Снег Север » 03.07.2018 20:45:56

SQLTransaction1.Action. Обычно для mySQL устанавливается в caCommitRetaining.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение RustemNur » 04.07.2018 15:45:04

Спасибо.

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

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

Сообщение Mirage » 05.07.2018 00:49:19

read commited это уровень изоляции по умолчанию для практически любой СУБД. Чтобы увидеть изменения в текущей транзакции, надо сделать commit, очевидно.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение RustemNur » 05.07.2018 15:06:51

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

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

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

Что-то совсем не очевидно, простите. Оно на то и read commited, чтобы в текущей активной транзакции видеть подтвержденные в других транзакциях изменения.
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

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

Сообщение wadman » 05.07.2018 16:57:49

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

Для утилиты isql, не для fb.
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

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

Сообщение Mirage » 06.07.2018 03:22:39

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



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

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


Ну да, подтвержденные это и есть commited.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

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

Сообщение Снег Север » 06.07.2018 08:02:24

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

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

Сообщение RustemNur » 06.07.2018 10:40:28

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

ЗЫ: на форумах я привык, когда ко мне обращаются на "ты", так что, если не трудно
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

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

Сообщение Снег Север » 06.07.2018 12:58:43

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

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

Сообщение RustemNur » 06.07.2018 13:31:53

Снег Север, да, может быть с caCommitRetaining датасеты не закроются - я до сих пор не пользовал его, т.к. разработчики FB сильно нехорошо о нем отзывались применительно к своему серверу, и так у меня это и отложилось в голове.
И тем не менее, держать на чтение открытой долгую транзакцию REPEATABLE READ - это довольно сомнительный подход ...
И да, спасибо за ответы. Только вот как назначить уровень изоляции, я так и не выяснил ...
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

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

Сообщение Снег Север » 06.07.2018 17:22:27

RustemNur, mysql и fb работают очень по-разному. Если вы к чему-то привыкли на fb, то на mysql от этом забудьте... :D
Принцип работы аппликации с mysql - немедленные коммиты, если у вас innodb или вообще никаких, если myisam. И закрывать соединение только с концом работы аппликации. Все эти уровни изоляции - ересь... :D
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru