2014-01-15 3 views
1

Я работаю над PostgreSQL 9.1.4.Сделка транзакций назад не работает в Postgresql

Я вставляю данные в 2 стола, которые хорошо работают.

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

Я попробовал свойства в «max_prepared_transactions» с ненулевым значением в /etc/postgres/postgres.conf. Но все же транзакция roll не работает.

+4

Это не имеет особого смысла. Пожалуйста, * покажите код, в котором вы работаете *, и любые сообщения об ошибках. –

+1

Возможно, вы не отключили автокоммит? –

+0

@a_horse_with_no_name: ваш комментарий, вероятно, был действительным в то время, но из моего понимания, отключить autocommit сейчас не нужно и не возможно: http://stackoverflow.com/a/17936997 – ssc

ответ

2

в PostgreSQL, вы не можете писать или совершить откат в явном виде внутри функции. Я думаю, вы могли бы использовать начать конец блока просто написать его просто

BEGIN; 
    insert into tst_table values ('ABC'); 
    Begin 
    insert into 2nd_table values ('ABC'); 
    EXCEPTION 
    when your_exception then 
    ROLL BACK; 
    END; 
END; 
-3

Я думаю, что было бы полезно

create proc DataInsertInTable 
    as 
    begin tran 

    insert into Table1 values('Table1Data','XYZ') 
    if(@@ERROR <>0) 
    begin 
     rollback tran; 
     return 0 
    end 
    insert into Table2 values('Table2Data','ABC') 
    if(@@ERROR <>0) 
    begin 
     rollback tran; 
     return 0 
    end 
    commit Tran 
    return 1 
+1

во-первых, это не postgresql-код. во-вторых, даже если это было, это не связано с вопросом, даже не закрытием – mvp

1

Вероятно, вы не начали транзакции.

Пожалуйста, попробуйте

BEGIN; 
    INSERT INTO first_table VALUES(10); 

    -- second insert should fail 
    INSERT INTO second_table VALUES(10/0); 

ROLLBACK; 
Смежные вопросы