使用“乐观锁定”时出现问题,我在查看表后无法更新

时间:2018-11-09 22:22:07

标签: oracle plsql database-trigger

我在表中添加tcn:

alter table accounts add TCN integer;

还有UPDATE accounts set TCN = DBMS_UTILITY.GET_TIME;

tcn不能为空alter table accounts modify TCN not null;

我在更新之前创建了触发器

SQL> create or replace trigger acc_preupdate
  2  before update on accounts
  3  for each row
  4  begin
  5  if(:NEW.TCN != :OLD.TCN+1) THEN
  6  RAISE_APPLICATION_ERROR(-20000, 'Concurrency Failure');
  7  end if;
  8  :NEW.TCN := DBMS_UTILITY.GET_TIME;
  9  END;
 10  /

在插入之前触发

SQL> create or replace trigger acc_preinsert
  2  before insert on accounts
  3  for each row
  4  begin
  5  :NEW.TCN := DBMS_UTILITY.GET_TIME;
  6  end;
  7  /

我在表格中插入

SQL> insert into accounts (acc_id, acc_name, acc_amount, acc_date)
  2  values(acc_seq.nextval, 'petar', 15000, sysdate);

当我想更新表时,出现此错误

SQL> update accounts
  2  set acc_amount = 1000000
  3  where acc_id = 1;
update accounts
       *
ERROR at line 1:
ORA-20000: Concurrency Failure
ORA-06512: at "PETAR1.ACC_PREUPDATE", line 3
ORA-04088: error during execution of trigger 'PETAR1.ACC_PREUPDATE'

现在我选择ID为1的用户。

select acc_name, acc_amount from accounts where acc_id = 1;

当我尝试再次更新表时,出现相同的错误。

为什么我不能更新表格?

我使用Oracle 12c r2

1 个答案:

答案 0 :(得分:1)

在最后的TextView txtName = view.findViewById(R.id.songName_text); txtName.setText(song.getName()); 语句中,您未指定对update的更新,因此在TCN触发器中,update的值是您之前插入的(通过:OLD.TCN触发器)。由于insert并未明确更改,因此update也是相同的值。

因此:NEW.TCN等于:OLD.TCN,并使:NEW.TCN中的if条件触发为true,从而引发自定义异常。