| Bug #4595 | UPDATE multiple rows with ordered index fails | ||
|---|---|---|---|
| Submitted: | 18 Jul 2004 9:10 | Modified: | 10 Aug 2004 16:18 | 
| Reporter: | Johan Andersson | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Cluster: Cluster (NDB) storage engine | Severity: | S1 (Critical) | 
| Version: | mysql 4.1 bk src | OS: | Linux (RH9) | 
| Assigned to: | Martin Skold | CPU Architecture: | Any | 
   [18 Jul 2004 9:10]
   Johan Andersson        
  
 
   [19 Jul 2004 17:08]
   Martin Skold        
  The problem seems to be that select for update over an ordered index works quite different from a full table scan. Here a scan is first made and then a pk_read is done with a consequennt update. With a full table scan an update is done after each next_result. The bug is that ndbcluster::extra(HA_EXTRA_RETRIEVE_ALL_COLS) is called before the ordered index scan, but this is ignored in the pk_read. The fix is to change pk_read to retrieve all columns, including the primary key.
   [19 Jul 2004 17:28]
   Martin Skold        
  This solution will however not work well until we fix range scan locks. This is a different problem, but the example might not give transaction consistent results (since the ordered index scan does not keep locks). In a full table scan we do take over of read locks.
   [22 Jul 2004 23:22]
   Johan Andersson        
  Great to see that a patch is pending. Please check the following (I am going on vacation) and that expected result is according to read commit consistency (using two mysql clients): CLIENT A: mysql> create table t1(a integer not null primary key, b integer not null) type=ndb; Query OK, 0 rows affected, 1 warning (0.68 sec) populate with data: mysql> select * from t1; +---+----+ | a | b | +---+----+ | 7 | 11 | | 8 | 11 | | 6 | 10 | | 2 | 10 | | 4 | 10 | | 5 | 10 | | 3 | 10 | | 1 | 10 | +---+----+ 8 rows in set (0.00 sec) CLIENT A: mysql> create index t1_b_idx on t1(b); mysql> begin; mysql> update t1 set b=b+1 where b=10; CLIENT B: mysql> select * from t1; CLIENT A: mysql> commit; Please check the result and if that complies with read_committed
   [10 Aug 2004 16:18]
   Martin Skold        
  Last test also verified.
