Hi,

By the way, a shorter SQL script test case:

drop table test;
create table test(id int primary key, a int unique, b int);
set autocommit false;
insert into test values (1, 1, 1);
insert into test values (2, 2, 2);
-- gives a constraint violation
update test set a = 1 where id = 2;
-- the row that failed to update is no longer found by its old values
select * from test where id = 2;
select * from test where a = 2;
-- both selects above fail to find anything...
-- ...but this works
select * from test where b = 2;

Regards,
Thomas

On Thursday, April 17, 2014, Noel Grandin <[email protected]> wrote:

>
> This is my initial analysis - I don't know how to solve it yet, but either
> someone else will, or I will get back to it at a later date.
>
>
> This problem appears to be specific to the combination of an in-memory
> database and MVCC=true, which is on by default in version 1.4.x
>
> The problem is occurring somewhere in the stacktrace below.
> I suspect it has to do with one of
>         MultiVersionIndex.add(Session, Row)
>         RegularTable.addRow(Session, Row)
> both which are attempting to do an insert/remove combination.
> I suspect that one of them is incorrectly restoring state when a unique
> constraint violation occurs.
>
> Thread [H2 Console thread] (Suspended (breakpoint at line 103 in
> BaseIndex))
>         owns: Database  (id=103)
>         owns: Session  (id=104)
>         TreeIndex(BaseIndex).getDuplicateKeyException(String) line: 103
>         TreeIndex.add(Session, Row) line: 69
>         MultiVersionIndex.add(Session, Row) line: 59
>         RegularTable.addRow(Session, Row) line: 120
>         RegularTable(Table).updateRows(Prepared, Session, RowList) line:
> 467
>         Update.update() line: 146
>         CommandContainer.update() line: 79
>         CommandContainer(Command).executeUpdate() line: 254
>         JdbcStatement.executeInternal(String) line: 186
>         JdbcStatement.execute(String) line: 160
>         WebThread(WebApp).getResult(Connection, int, String, boolean,
> boolean) line: 1391
>         WebThread(WebApp).query(Connection, String, int, int,
> StringBuilder) line: 1064
>         WebApp$1.next() line: 1026
>         WebApp$1.next() line: 1
>         WebThread.process() line: 168
>         WebThread.run() line: 94
>         Thread.run() line: 662
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "H2 Database" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/h2-database.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Reply via email to