| // SPDX-License-Identifier: LGPL-2.1-or-later |
| // Copyright (c) 2012-2014 Monty Program Ab |
| // Copyright (c) 2015-2021 MariaDB Corporation Ab |
| |
| package org.mariadb.jdbc; |
| |
| import java.sql.Connection; |
| |
| /** Transaction isolation enumeration */ |
| public enum TransactionIsolation { |
| /** |
| * dirty reads and non-repeatable reads are prevented; phantom reads can occur. This level |
| * prohibits a transaction from reading a row with uncommitted changes in it, and it also |
| * prohibits the situation where one transaction reads a row, a second transaction alters the row, |
| * and the first transaction rereads the row, getting different values the second time (a |
| * "non-repeatable read"). |
| */ |
| REPEATABLE_READ("REPEATABLE-READ", java.sql.Connection.TRANSACTION_REPEATABLE_READ), |
| /** |
| * dirty reads are prevented; non-repeatable reads and phantom reads can occur. This level only |
| * prohibits a transaction from reading a row with uncommitted changes in it. |
| */ |
| READ_COMMITTED("READ-COMMITTED", Connection.TRANSACTION_READ_COMMITTED), |
| /** |
| * dirty reads, non-repeatable reads and phantom reads can occur. This level allows a row changed |
| * by one transaction to be read by another transaction before any changes in that row have been |
| * committed (a "dirty read"). If any of the changes are rolled back, the second transaction will |
| * have retrieved an invalid row. |
| */ |
| READ_UNCOMMITTED("READ-UNCOMMITTED", Connection.TRANSACTION_READ_UNCOMMITTED), |
| /** |
| * dirty reads, non-repeatable reads and phantom reads are prevented. This level includes the |
| * prohibitions in TRANSACTION_REPEATABLE_READ and further prohibits the situation where one |
| * transaction reads all rows that satisfy a WHERE condition, a second transaction inserts a row |
| * that satisfies that WHERE condition, and the first transaction rereads for the same condition, |
| * retrieving the additional "phantom" row in the second read. |
| */ |
| SERIALIZABLE("SERIALIZABLE", Connection.TRANSACTION_SERIALIZABLE); |
| |
| private final String value; |
| private final int level; |
| |
| TransactionIsolation(String value, int level) { |
| this.value = value; |
| this.level = level; |
| } |
| |
| /** |
| * Get transaction isolation command |
| * |
| * @return transaction isolation command |
| */ |
| public String getValue() { |
| return value; |
| } |
| |
| /** |
| * Get transaction isolation level |
| * |
| * @return transaction isolation level |
| */ |
| public int getLevel() { |
| return level; |
| } |
| |
| /** |
| * Get TransactionIsolation from value |
| * |
| * @param value value |
| * @return transaction isolation |
| */ |
| public static TransactionIsolation from(String value) { |
| for (TransactionIsolation transactionIsolation : values()) { |
| if (transactionIsolation |
| .value |
| .replaceAll("[ \\-_]", "") |
| .equalsIgnoreCase(value.replaceAll("[ \\-_]", ""))) { |
| return transactionIsolation; |
| } |
| } |
| throw new IllegalArgumentException( |
| String.format("Wrong argument value '%s' for TransactionIsolation", value)); |
| } |
| } |