Enum TransactIsolation

java.lang.Object
java.lang.Enum<TransactIsolation>
xyz.cofe.sql.cpool.TransactIsolation
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<TransactIsolation>, java.lang.constant.Constable

public enum TransactIsolation
extends java.lang.Enum<TransactIsolation>
Режим изоляции транзакций.

Основная статя на wiki При параллельном выполнении транзакций возможны следующие проблемы:

  • потерянное обновление (англ. lost update) — при одновременном изменении одного блока данных разными транзакциями одно из изменений теряется;
  • «грязное» чтение (англ. dirty read) — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится);
  • неповторяющееся чтение (англ. non-repeatable read) — при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными;
  • фантомное чтение (англ. phantom reads) — одна транзакция в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям. Другая транзакция в интервалах между этими выборками добавляет или удаляет строки или изменяет столбцы некоторых строк, используемых в критериях выборки первой транзакции, и успешно заканчивается. В результате получится, что одни и те же выборки в первой транзакции дают разные множества строк.
Author:
Kamnev Georgiy (nt.gocha@gmail.com)
  • Nested Class Summary

    Nested classes/interfaces inherited from class java.lang.Enum

    java.lang.Enum.EnumDesc<E extends java.lang.Enum<E>>
  • Enum Constant Summary

    Enum Constants 
    Enum Constant Description
    Committed
    чтение фиксированных данных.
    Repeatable
    повторяемость чтения.
    Serializable
    упорядочиваемость.
    Uncommitted
    чтение незафиксированных данных.
  • Method Summary

    Modifier and Type Method Description
    int value()  
    static TransactIsolation valueOf​(java.lang.String name)
    Returns the enum constant of this type with the specified name.
    static TransactIsolation[] values()
    Returns an array containing the constants of this enum type, in the order they are declared.

    Methods inherited from class java.lang.Enum

    clone, compareTo, describeConstable, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf

    Methods inherited from class java.lang.Object

    getClass, notify, notifyAll, wait, wait, wait
  • Enum Constant Details

    • Uncommitted

      public static final TransactIsolation Uncommitted
      чтение незафиксированных данных.

      Низший (первый) уровень изоляции.

      Он гарантирует только отсутствие потерянных обновлений.

      Если несколько параллельных транзакций пытаются изменять одну и ту же строку таблицы, то в окончательном варианте строка будет иметь значение, определенное всем набором успешно выполненных транзакций.

      При этом возможно считывание не только логически несогласованных данных, но и данных, изменения которых ещё не зафиксированы.

      Типичный способ реализации данного уровня изоляции — блокировка данных на время выполнения команды изменения, что гарантирует, что команды изменения одних и тех же строк, запущенные параллельно, фактически выполнятся последовательно, и ни одно из изменений не потеряется.

      Транзакции, выполняющие только чтение, при данном уровне изоляции никогда не блокируются.

    • Committed

      public static final TransactIsolation Committed
      чтение фиксированных данных.

      Большинство промышленных СУБД, в частности, Microsoft SQL Server, PostgreSQL и Oracle, по умолчанию используют именно этот уровень.

      На этом уровне обеспечивается защита от чернового, «грязного» чтения, тем не менее, в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы.

      В итоге первая транзакция будет работать с другим набором данных.

      Реализация завершённого чтения может основываться на одном из двух подходов: блокировании или версионности.

      Блокирование читаемых и изменяемых данных.

      Заключается в том, что пишущая транзакция блокирует изменяемые данные для читающих транзакций, работающих на уровне read committed или более высоком, до своего завершения, препятствуя, таким образом, «грязному» чтению, а данные, блокируемые читающей транзакцией, освобождаются сразу после завершения операции SELECT (таким образом, ситуация «неповторяющегося чтения» может возникать на данном уровне изоляции).

      Сохранение нескольких версий параллельно изменяемых строк.

      При каждом изменении строки СУБД создаёт новую версию этой строки, с которой продолжает работать изменившая данные транзакция, в то время как любой другой «читающей» транзакции возвращается последняя зафиксированная версия.

      Преимущество такого подхода в том, что он обеспечивает большую скорость, так как предотвращает блокировки.

      Однако он требует, по сравнению с первым, существенно большего расхода оперативной памяти, которая тратится на хранение версий строк.

      Кроме того, при параллельном изменении данных несколькими транзакциями может создаться ситуация, когда несколько параллельных транзакций произведут несогласованные изменения одних и тех же данных (поскольку блокировки отсутствуют, ничто не помешает это сделать).

      Тогда та транзакция, которая зафиксируется первой, сохранит свои изменения в основной БД, а остальные параллельные транзакции окажется невозможно зафиксировать (так как это приведёт к потере обновления первой транзакции).

      Единственное, что может в такой ситуации СУБД — это откатить остальные транзакции и выдать сообщение об ошибке «Запись уже изменена».

      Конкретный способ реализации выбирается разработчиками СУБД, а в ряде случаев может настраиваться.

      Так, по умолчанию MS SQL использует блокировки, но (в версии 2005 и выше) при установке параметра READ_COMMITTED_SNAPSHOT базы данных переходит на стратегию версионности,

      Oracle исходно работает только по версионной схеме.

      В Informix можно предотвратить конфликты между читающими и пишущими транзакциями, установив параметр конфигурации USELASTCOMMITTED (начиная с версии 11.1), при этом читающая транзакция будет получать последние подтвержденные данные

    • Repeatable

      public static final TransactIsolation Repeatable
      повторяемость чтения.

      Уровень, при котором читающая транзакция «не видит» изменения данных, которые были ею ранее прочитаны.

      При этом никакая другая транзакция не может изменять данные, читаемые текущей транзакцией, пока та не окончена.

      Блокировки в разделяющем режиме применяются ко всем данным, считываемым любой инструкцией транзакции, и сохраняются до её завершения.

      Это запрещает другим транзакциям изменять строки, которые были считаны незавершённой транзакцией.

      Однако другие транзакции могут вставлять новые строки, соответствующие условиям поиска инструкций, содержащихся в текущей транзакции.

      При повторном запуске инструкции текущей транзакцией будут извлечены новые строки, что приведёт к фантомному чтению.

      Учитывая то, что разделяющие блокировки сохраняются до завершения транзакции, а не снимаются в конце каждой инструкции, степень параллелизма ниже, чем при уровне изоляции READ COMMITTED.

      Поэтому пользоваться данным и более высокими уровнями транзакций без необходимости обычно не рекомендуется.

    • Serializable

      public static final TransactIsolation Serializable
      упорядочиваемость.

      Самый высокий уровень изолированности;

      транзакции полностью изолируются друг от друга, каждая выполняется так, как будто параллельных транзакций не существует.

      Только на этом уровне параллельные транзакции не подвержены эффекту «фантомного чтения».

  • Method Details

    • values

      public static TransactIsolation[] values()
      Returns an array containing the constants of this enum type, in the order they are declared.
      Returns:
      an array containing the constants of this enum type, in the order they are declared
    • valueOf

      public static TransactIsolation valueOf​(java.lang.String name)
      Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
      Parameters:
      name - the name of the enum constant to be returned.
      Returns:
      the enum constant with the specified name
      Throws:
      java.lang.IllegalArgumentException - if this enum type has no constant with the specified name
      java.lang.NullPointerException - if the argument is null
    • value

      public int value()