![104idebondi | Embarcadero RAD Studio Delphi C++Builder Blogs](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2020/08/104idebondi-1.png?resize=1140%2C694&ssl=1)
До RAD Studio 10.4 параметр изоляции транзакции по умолчанию для соединений FireDAc считался подтвержденным. Это TFDConnection.TxOptions.Isolation был xiReadCommitted. Это было значение, установленное для компонента, и по умолчанию оно не отправлялось в базу данных. FireDAC просто предположил, что значение по умолчанию в его конфигурации было значением по умолчанию для базы данных, и он не отправлял эту конфигурацию изоляции явно в базу данных в начале сеанса. Например, в MySQL требуемая команда SET SESSION TRANSACTION ISOLATION LEVEL не была выполнена, если значение по умолчанию не было изменено. В этом случае изоляция транзакции MySQL оставалась равной значению базы данных по умолчанию, равному xiRepeatableRead, независимо от того, что было установлено в конфигурации FireDAC по умолчанию.
Чтобы решить эту проблему, мы решили, что лучше оставить уровень изоляции по умолчанию на xiUnspecified, что означает, что если вам не потребуется определенный уровень изоляции, будет использоваться конфигурация по умолчанию для конкретной базы данных — это тот, который уже предварительно установлен int база данных, и вам не нужно спрашивать настройку. Уровень изоляции по умолчанию оптимизирован для конкретной базы данных, поскольку значения по умолчанию отличаются, а некоторые уровни изоляции даже не поддерживаются всеми ядрами баз данных одинаково хорошо.
Если разработчик хочет использовать уровень изоляции, отличный от уровня изоляции по умолчанию, используемого базой данных, он должен быть явно установлен в конфигурации компонента или в коде. Если разработчик хочет использовать базу данных по умолчанию, код не требуется.
Вот уровни изоляции основных баз данных по умолчанию в терминах FireDAC — опять же, значение свойства просто xiUnspecified:
DB2 — xiReadCommitted
InterBase и Firebird — xiSnapshot
MySQL и MariaDB — xiRepeatableRead
Oracle — xiReadCommitted
Microsoft SQL Server — xiReadCommitted
SQLite — xiSerializible
PostgreSQL — xiReadCommitted
Я надеюсь, что это поможет прояснить изменение и объяснить, как его обойти, изменив уровень изоляции транзакции вашего FireDAC-соединения на тот, который вам конкретно нужен, если он отличается от уровня базы данных по умолчанию. Это изменение не было указано в примечаниях к выпуску RAD Studio 10.4, и оно действительно вызывало некоторые опасения (и сообщения об ошибках).
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition