Skip to main content
1-Visitor
September 3, 2015
Question

duplicated key in DataTable

  • September 3, 2015
  • 1 reply
  • 1847 views

When I call AddDataTableEntry or AddOrUpdateDataTableEntry very quickly, two data row with same key will be added.

How to settle it?

 

Both serialNumber and alarmType are primary key. I have test unique primary key, but same error.

Code:

 

var query = {

  "filters": {

    "type": "AND",

    "filters": [

      {

        "fieldName": "serialNumber",

        "type": "EQ",

        "value": serialNumber

      },

      {

        "fieldName": "alarmType",

        "type": "EQ",

        "value": alarmType

      }

    ]

  }

};

 

 

var params = {

    query: query,

    maxItems: 1

};

 

 

var old_times = 0;

 

 

var cc = Things["AlarmTimesTable"].QueryDataTableEntries( params );

if ( cc !== undefined && cc.getRowCount() != 0 ) {

    old_times = cc.getRow(0).times;

    //var values = cc;//.getRow(0);

}

 

 

var values = Things["AlarmTimesTable"].CreateValues();

values.gateway = me.name;

values.updateTime = updateTime;

values.serialNumber = serialNumber;

values.alarmType = alarmType;

values.times = old_times + 1;

 

 

var params = {

    //source :  me.name,

    values : values,

};

 

 

Things["AlarmTimesTable"].AddOrUpdateDataTableEntry( params );

logger.error("out");

    1 reply

    cdu1-VisitorAuthor
    1-Visitor
    September 3, 2015

    "very quickly" means two http request at same time

    12-Amethyst
    September 3, 2015

    i met the same issue, and the only way to fix it is to create a service that locate duplicate and suppress them.

    Seems there is  a delay before a newly written entry can be read

    cdu1-VisitorAuthor
    1-Visitor
    September 3, 2015

    Hi Laurent,

    I noticed that 6.5 settle the issue, but the second http request will report error, i.e. one of data be dropped.

    I think the better solution is multithreading-locking, and a delay after Add ( not Update ) like you said.

    Do you know is there any mutex/critical_section/thread_lockig functions? or task queue for one thread ?