СДЕЛКА в java + sqlite3 - PullRequest
       4

СДЕЛКА в java + sqlite3

2 голосов
/ 07 марта 2012

Как я могу совершить транзакцию в java + sqlite3 Я уже проверяю Google. Я хочу сделать так, чтобы это было оператором отката, поэтому, если где-то в заявлении идет не так, все операторы переходят в «пробел», и БД получает откат на момент до начала транзакции.

Что-то подобное здесь Roolback-stmt Надеюсь, мой вопрос понятен.Поэтому помните, что английский не мой родной язык.Вот часть кода, который я хочу сделать, чтобы быть утверждением:

ArrayList <String> al = new ArrayList <String> ();
try {
    // transaction begin;
    ResultSet rs = stat.executeQuery("select _id, godziny_id from tblZmiany where harmonogram_id = " + h_id + " order by pracownik_id, Dzien");
    while (rs.next()) {
        al.add("insert into tblWykonanie (Zmiana_id, Godziny_id) values ('" + rs.getLong(1) + "', " + rs.getInt(2) + ");");
    }
    for (String s : al)
        if (stat.executeUpdate(s) < 1) {
            // Jeśli insert nie wstawił kolejnego rekordu
            //rollback;
            error_code = "Wystąpił problem podczas zatwierdzania harmonogramu.";
            return false;
        }
        // commit;           
} catch (SQLException e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
    return false;
} catch (Exception e) {
    error_code = e.getMessage();
    return false;
}
return true;

Ответы [ 2 ]

11 голосов
/ 07 марта 2012

Это можно сделать одним из двух способов: на уровне соединения или с помощью пакетных операторов .

На уровне соединения:

final boolean oldAutoCommit = stat.getConnection().getAutoCommit();
stat.getConnection().setAutoCommit(false);

try {
    // Your update and insert code here
} catch(Exception e) {
    stat.getConnection().rollback();
} finally {
    stat.getConnection().commit();
    stat.getConnection().setAutoCommit(oldAutoCommit);
}

Обработка ошибокбыл исключен из псевдокода, но вы получите общее представление.Возможно, вы захотите избежать возни с соединением и вместо этого использовать пакетных операторов :

for(String query: queries) {
    stat.addBatch(query);
}

try {
    stat.executeBatch();
} catch(Exception e) {
    // ...
}

, что намного чище.Помните, что вы всегда можете проверить, поддерживает ли ваша БД / Драйвер пакетную транзакцию через DatabaseMetaData.supportsBatchUpdates().

0 голосов
/ 07 марта 2012

Используйте драйвер JDBC, например SQLiteJDBC , который поддерживает транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...