powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и уровни изоляции
6 сообщений из 6, страница 1 из 1
JDBC и уровни изоляции
    #38692334
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый, уважаемые! Решил освежить JDBC немножко, вот копаюсь.

Имею Java 6 + JDBC + MySQL 5.1. Хочу написать шпаргалку для себя на тему уровней изоляции. Написал код, который считывает таблицу, ждет пока я вручную через интерфейс БД исправлю/добавлю ряды, считывает таблицу заново. Результат второго считывания я отмечаю как shown, если оно показало изменения, произошедшие после первого. Получилось так:

READ COMMITED
if during the read transaction something happens..
all UPDATE are shown
all INSERT are shown

REPEATABLE READ
if during the read transaction something happens..
UPDATE is not shown = "preventing nonrepeatable read"
INSERT MUST BE shown = "phantom read" - НО НА ДЕЛЕ ОН НЕ ПОКАЗЫВАЕТСЯ!!!

SERIALIZABLE
if during the read transaction something happens..
it cannot: they just go one by one

Код вот здесь:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
package jdbc;
import java.sql.*;
public class JDBCGames {
    public static void main(String[] args) {
        Connection con = null;
        try { // load the driver
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        } catch (Exception e) { // problem loading driver, class not exist?
            e.printStackTrace();
            return;
        }
        try {
            con = DriverManager.getConnection("jdbc:mysql://localhost/test", "USERNAME", "PASSWORD");

            con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); //set tx_level if you want

            con.setAutoCommit(false);

            //first read
            Statement select = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet result = select.executeQuery("SELECT * FROM names");

            printResultSet(result);

            Thread.sleep(10000); //wait here while I insert line manually into the table via DB interface to make a phantom read

            //second read
            Statement select2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet result2 = select2.executeQuery("SELECT * FROM names");

            printResultSet(result2);

            con.commit();

        } catch (Exception e) {
            e.printStackTrace();
    } finally {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace(); 
            }
        }
    }
    }

    static void printResultSet(ResultSet result) throws SQLException{
        while (result.next()) {
            int age;
            String name;
            String second_name;
            age = result.getInt(4);
            if (result.wasNull()) {
                age = -1;
            }
            name = result.getString(2);
            if (result.wasNull()) {
                name = null;
            }
            second_name = result.getString(3);
            if (result.wasNull()) {
                second_name = null;
            }
            System.out.println(String.format("name %s second_name %s age %d", name, second_name, age));
        }
    }
}



Вопросы:

Моя шпаргалка верная?

Почему я не вижу phantom-read при уровне изоляции REPEATABLE READ?

Если внутри транзакции идет UPDATE или INSERT - он гарантировано при любых настройках виден этой же транзакции?

Когда будет разница при использовании параметров ResultSet TYPE_SCROLL_SENSITIVE/INSENSITIVE? У меня почему-то всегда если ResultSet получен, то никакие изменения, внесенные в базу после считывания, в него перенесены не будут. А тогда зачем этот параметр.

Каков scope изменения уровня изоляции через JDBC?
На это: SELECT * FROM information_schema.session_variables WHERE variable_name = 'tx_isolation' JDBC не влияет.

Можно гнать несколько запросов через один Connection одновременно? Что с многопоточностью Connection?
...
Рейтинг: 0 / 0
JDBC и уровни изоляции
    #38692516
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymytryВопросы:
Моя шпаргалка верная?

=== нежизненная


Почему я не вижу phantom-read при уровне изоляции REPEATABLE READ?

=== ты их увидишь при commited изоляции. Фантомы вполне нормальное дело.


Если внутри транзакции идет UPDATE или INSERT - он гарантировано при любых настройках виден этой же транзакции?

=== при уровне кммитед - да. А это 99 и 9 процентов нужная изоляция


Когда будет разница при использовании параметров ResultSet TYPE_SCROLL_SENSITIVE/INSENSITIVE? У меня почему-то всегда если ResultSet получен, то никакие изменения, внесенные в базу после считывания, в него перенесены не будут. А тогда зачем этот параметр.

Каков scope изменения уровня изоляции через JDBC?
На это: SELECT * FROM information_schema.session_variables WHERE variable_name = 'tx_isolation' JDBC не влияет.

Можно гнать несколько запросов через один Connection одновременно? Что с многопоточностью Connection?

=== AFAIK одна переменная на коннект. Если этого мало - есть пул.
...
Рейтинг: 0 / 0
JDBC и уровни изоляции
    #38692556
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

спасибо за ответ!

(1) Насколько я понимаю, я должен видеть phantom reads при READ REPEATABLE тоже:

Repeatable reads ( http://en.wikipedia.org/wiki/Isolation_(database_systems)#Repeatable_reads)

In this isolation level, a lock-based concurrency control DBMS implementation keeps read and write locks (acquired on selected data) until the end of the transaction. However, range-locks are not managed, so phantom reads can occur.

(2) Если внутри транзакции идет UPDATE или INSERT - он гарантировано при любых настройках виден этой же транзакции?
=== при уровне кммитед - да. А это 99 и 9 процентов нужная изоляция

А при других уровнях разве есть разница?
...
Рейтинг: 0 / 0
JDBC и уровни изоляции
    #38692583
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymytry,

таблица юзает движок InnoDB? Не все базы поддерживают все уровни изоляций, к слову.
...
Рейтинг: 0 / 0
JDBC и уровни изоляции
    #38692616
Dymytry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,
благодарю! Вы правы, дело в innoDB. Оказалось что innoDB поддерживает все уровни изоляции, однако фантомные транзакции в REPEATABLE READ уровне там невозможны.
...
Рейтинг: 0 / 0
JDBC и уровни изоляции
    #38692632
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymytryА при других уровнях разве есть разница?
я 0,1 процента не проверял и не ставил. В работе никогда нужно не было.
Всегда READ_COMMITED, как менее нагружающий БД.
Лучше перефразируй вопрос в: "когда он не нужен" и на форум БД. Это их епархия.
Удачи!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и уровни изоляции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]