Откат транзакции не работает в Postgresql

Я работаю над PostgreSQL 9.1.4.

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

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

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


person Kanchetianeel    schedule 15.01.2014    source источник
comment
Это не имеет особого смысла. Пожалуйста, покажите код, который вы используете, и любые сообщения об ошибках.   -  person Craig Ringer    schedule 15.01.2014
comment
Может быть, вы не отключили автокоммит?   -  person a_horse_with_no_name    schedule 15.01.2014
comment
@a_horse_with_no_name: ваш комментарий, вероятно, был действителен в то время, но, насколько я понимаю, отключение автоматической фиксации сейчас не нужно и невозможно: stackoverflow.com/a /17936997   -  person ssc    schedule 30.09.2016


Ответы (3)


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

BEGIN;
   insert into tst_table values ('ABC');
   Begin
    insert into 2nd_table values ('ABC');
   EXCEPTION
    when your_exception then
    ROLL BACK;
   END;
END;
person smn_onrocks    schedule 17.01.2014

Возможно вы не начали транзакцию.

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

BEGIN;
  INSERT INTO first_table VALUES(10);

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

ROLLBACK;
person Pavel Stehule    schedule 15.01.2014

я думаю было бы полезно

  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
person code save    schedule 15.01.2014
comment
во-первых, это не код postgresql. во-вторых, даже если и было, то это не имеет отношения к вопросу, даже близко - person mvp; 15.01.2014
comment
Это синтаксис Microsoft SQL Server. - person Andra; 20.10.2019