我在表中添加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
答案 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,从而引发自定义异常。