qwtsc opened a new issue, #2334:
URL: https://github.com/apache/incubator-hugegraph/issues/2334

   ### Bug Type (问题类型)
   
   other exception / error (其他异常报错)
   
   ### Before submit
   
   - [X] 我已经确认现有的 [Issues](https://github.com/apache/hugegraph/issues) 与 
[FAQ](https://hugegraph.apache.org/docs/guides/faq/) 中没有相同 / 重复问题 (I have 
confirmed and searched that there are no similar problems in the historical 
issue and documents)
   
   ### Environment (环境信息)
   
   unique key index is not valid when insert two vertex concurrently using 
mysql as backend store.
   
   ### Expected & Actual behavior (期望与实际表现)
   
   
![image](https://github.com/apache/incubator-hugegraph/assets/34210641/e54240ec-a5c9-4305-8093-f78305f19de9)
   
   More than one element id can be found with the same index label and the same 
field value, which is unacceptable for production env. When I read the code, I 
found the following comment that made in 2019.
   ```java
                   Id id = element.id();
                   // TODO: add lock for updating unique index
                   if (!removed && this.existUniqueValue(indexLabel, value, 
id)) {
                       throw new IllegalArgumentException(String.format(
                                 "Unique constraint %s conflict is found for 
%s",
                                 indexLabel, element));
                   }
                   this.updateIndex(indexLabel, value, element.id(),
                                    expiredTime, removed);
   ```
   and if unique index update process is not lock-protected by now, the schema 
of mysql unique index table should not reuse the definition of secondary index 
and maybe change to use FIELD_VALUE and INDEX_LABEL_ID as primary keys. 
However, this is a break change and will impact lots of current users.
   ```java
       public static class UniqueIndex extends SecondaryIndex {
   
           public static final String TABLE = HugeType.UNIQUE_INDEX.name();
   
           public UniqueIndex(String store) {
               // should overwrite the constructor to not use the same keys 
with SecondaryIndex.
               super(store, TABLE, TYPES_MAPPING);
           }
       }
   
       public static class SecondaryIndex extends Index {
   
           public static final String TABLE = HugeType.SECONDARY_INDEX.name();
   
           public SecondaryIndex(String store) {
               this(store, TABLE, TYPES_MAPPING);
           }
   
           public SecondaryIndex(String store, String table,
                                 Map<String, String> typesMapping) {
               super(joinTableName(store, table));
   
               this.define = new TableDefine(typesMapping);
               this.define.column(HugeKeys.FIELD_VALUES, SMALL_TEXT);
               this.define.column(HugeKeys.INDEX_LABEL_ID, DATATYPE_IL);
               this.define.column(HugeKeys.ELEMENT_IDS, SMALL_TEXT);
               this.define.column(HugeKeys.EXPIRED_TIME, BIGINT);
               this.define.keys(HugeKeys.FIELD_VALUES,
                                HugeKeys.INDEX_LABEL_ID,
                                HugeKeys.ELEMENT_IDS);
           }
   
           @Override
           public final String entryId(MysqlBackendEntry entry) {
               String fieldValues = entry.column(HugeKeys.FIELD_VALUES);
               Integer labelId = entry.column(HugeKeys.INDEX_LABEL_ID);
               return SplicingIdGenerator.concat(fieldValues, 
labelId.toString());
           }
       }
   ```
   To be honest, it's a little bit frustrating.
   
   ### Vertex/Edge example (问题点 / 边数据举例)
   
   _No response_
   
   ### Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)
   
   _No response_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@hugegraph.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to