Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и уровни изоляции / 6 сообщений из 6, страница 1 из 1
09.07.2014, 19:38
    #38692334
Dymytry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и уровни изоляции
День добрый, уважаемые! Решил освежить 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
09.07.2014, 23:57
    #38692516
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и уровни изоляции
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
10.07.2014, 01:20
    #38692556
Dymytry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и уровни изоляции
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
10.07.2014, 02:21
    #38692583
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и уровни изоляции
Dymytry,

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


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