MMBase

createKey should happen in transaction.

Details

  • Type: Improvement Improvement
  • Status: Resolved Resolved
  • Priority: Major Major
  • Resolution: Fixed
  • Affects Version/s: 1.9.3
  • Fix Version/s: 1.9.4, 2.0.0
  • Component/s: Database Layer
  • Description:
    Hide
    When generating a new key, using the 'number table' it will first do an update, then a select. It should do this in a transaction, because those two statemens should be atomic. Otherwise there is a small chance that another server will end up creating another node with the same number:

    org.mmbase.storage.StorageException: Duplicate entry '10853709' for key 1
    com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '10853709' for key 1
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
            at com.mysql.jdbc.Util.getInstance(Util.java:381)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
            at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
            at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
            at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
            at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
            at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
            at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
            at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
            at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
            at org.mmbase.storage.implementation.database.DatabaseStorageManager.executeUpdate(DatabaseStorageManager.java:1152)
            at org.mmbase.storage.implementation.database.DatabaseStorageManager.executeUpdateCheckConnection(DatabaseStorageManager.java:1124)
            at org.mmbase.storage.implementation.database.DatabaseStorageManager.create(DatabaseStorageManager.java:1062)
            at org.mmbase.storage.implementation.database.DatabaseStorageManager.create(DatabaseStorageManager.java:1015)
            at org.mmbase.storage.implementation.database.RelationalDatabaseStorageManager.simpleCreate(RelationalDatabaseStorageManager.java:58)
            at org.mmbase.storage.implementation.database.RelationalDatabaseStorageManager.create(RelationalDatabaseStorageManager.java:76)
            at org.mmbase.storage.implementation.database.DatabaseStorageManager.createWithoutEvent(DatabaseStorageManager.java:980)
            at org.mmbase.storage.implementation.database.DatabaseStorageManager.create(DatabaseStorageManager.java:991)
            at org.mmbase.module.core.MMObjectBuilder.insert(MMObjectBuilder.java:627)
            at org.mmbase.module.corebuilders.InsRel.insert(InsRel.java:216)
            at org.mmbase.module.core.MMObjectNode.insert(MMObjectNode.java:322)
            at org.mmbase.module.core.MMObjectBuilder.safeInsert(MMObjectBuilder.java:1072)
            at org.mmbase.module.core.MMObjectNode.insert(MMObjectNode.java:334)
            at org.mmbase.bridge.implementation.BasicNode.commit(BasicNode.java:526)
            at org.mmbase.bridge.implementation.BasicRelation.commit(BasicRelation.java:237)
            at org.mmbase.bridge.jsp.taglib.edit.CreateRelationTag.doStartTag(CreateRelationTag.java:62)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005fcreaterelation_005f0(pages_jsp.java:1702)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_c_005fotherwise_005f0(pages_jsp.java:1575)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_c_005fchoose_005f0(pages_jsp.java:1466)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_c_005fif_005f0(pages_jsp.java:791)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005flistnodes_005f0(pages_jsp.java:494)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005flistnodescontainer_005f0(pages_jsp.java:246)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005fcloud_005f0(pages_jsp.java:141)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005fcontent_005f0(pages_jsp.java:91)
            at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspService(pages_jsp.java:53)
    Show
    When generating a new key, using the 'number table' it will first do an update, then a select. It should do this in a transaction, because those two statemens should be atomic. Otherwise there is a small chance that another server will end up creating another node with the same number: org.mmbase.storage.StorageException: Duplicate entry '10853709' for key 1 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '10853709' for key 1         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)         at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)         at com.mysql.jdbc.Util.getInstance(Util.java:381)         at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)         at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)         at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)         at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)         at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)         at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)         at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)         at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)         at org.mmbase.storage.implementation.database.DatabaseStorageManager.executeUpdate(DatabaseStorageManager.java:1152)         at org.mmbase.storage.implementation.database.DatabaseStorageManager.executeUpdateCheckConnection(DatabaseStorageManager.java:1124)         at org.mmbase.storage.implementation.database.DatabaseStorageManager.create(DatabaseStorageManager.java:1062)         at org.mmbase.storage.implementation.database.DatabaseStorageManager.create(DatabaseStorageManager.java:1015)         at org.mmbase.storage.implementation.database.RelationalDatabaseStorageManager.simpleCreate(RelationalDatabaseStorageManager.java:58)         at org.mmbase.storage.implementation.database.RelationalDatabaseStorageManager.create(RelationalDatabaseStorageManager.java:76)         at org.mmbase.storage.implementation.database.DatabaseStorageManager.createWithoutEvent(DatabaseStorageManager.java:980)         at org.mmbase.storage.implementation.database.DatabaseStorageManager.create(DatabaseStorageManager.java:991)         at org.mmbase.module.core.MMObjectBuilder.insert(MMObjectBuilder.java:627)         at org.mmbase.module.corebuilders.InsRel.insert(InsRel.java:216)         at org.mmbase.module.core.MMObjectNode.insert(MMObjectNode.java:322)         at org.mmbase.module.core.MMObjectBuilder.safeInsert(MMObjectBuilder.java:1072)         at org.mmbase.module.core.MMObjectNode.insert(MMObjectNode.java:334)         at org.mmbase.bridge.implementation.BasicNode.commit(BasicNode.java:526)         at org.mmbase.bridge.implementation.BasicRelation.commit(BasicRelation.java:237)         at org.mmbase.bridge.jsp.taglib.edit.CreateRelationTag.doStartTag(CreateRelationTag.java:62)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005fcreaterelation_005f0(pages_jsp.java:1702)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_c_005fotherwise_005f0(pages_jsp.java:1575)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_c_005fchoose_005f0(pages_jsp.java:1466)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_c_005fif_005f0(pages_jsp.java:791)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005flistnodes_005f0(pages_jsp.java:494)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005flistnodescontainer_005f0(pages_jsp.java:246)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005fcloud_005f0(pages_jsp.java:141)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspx_meth_mm_005fcontent_005f0(pages_jsp.java:91)         at org.apache.jsp.onderhoud.migratie.neweditors.pages_jsp._jspService(pages_jsp.java:53)

Activity

Hide
Michiel Meeuwissen added a comment - 2010-05-04 15:48
For mysql you may need to switch on transaction support. E.g. in mmbaseroot.xml:
<property name="database">mysql-binaryasfile-transactions-keybuffer</property>
Show
Michiel Meeuwissen added a comment - 2010-05-04 15:48 For mysql you may need to switch on transaction support. E.g. in mmbaseroot.xml: <property name="database">mysql-binaryasfile-transactions-keybuffer</property>

People

Dates

  • Created:
    2010-05-04 15:37
    Updated:
    2010-05-04 15:49
    Resolved:
    2010-05-04 15:49