On the following page:
IBM discusses a surrogate key generation function, along with a
listing in Java (Appendix A at the end of the web page). However it
seems the function is not thread-safe!
Suppose for a certain Table X, the SURROGATEKEYVAL UE is currently set
to 100, and INCREMENT is set to 1. If 2 threads, A and B, enter
getSurrogateKey at nearly the same time It is possible for the
following sequence to occur:
1. Thread A executes:
updateKeyStmt.e xecute();
As a result, SURROGATEKEYVAL UE is now set to 101.
2. Thread B executes:
updateKeyStmt.e xecute();
As a result, SURROGATEKEYVAL UE is now set to 102.
3. Thread A executes:
ResultSet rs = getKeyStmt.exec uteQuery();
This will return 102.
4. Thread B executes:
ResultSet rs = getKeyStmt.exec uteQuery();
This will also return 102 !
Am I missing something here?
IBM discusses a surrogate key generation function, along with a
listing in Java (Appendix A at the end of the web page). However it
seems the function is not thread-safe!
Suppose for a certain Table X, the SURROGATEKEYVAL UE is currently set
to 100, and INCREMENT is set to 1. If 2 threads, A and B, enter
getSurrogateKey at nearly the same time It is possible for the
following sequence to occur:
1. Thread A executes:
updateKeyStmt.e xecute();
As a result, SURROGATEKEYVAL UE is now set to 101.
2. Thread B executes:
updateKeyStmt.e xecute();
As a result, SURROGATEKEYVAL UE is now set to 102.
3. Thread A executes:
ResultSet rs = getKeyStmt.exec uteQuery();
This will return 102.
4. Thread B executes:
ResultSet rs = getKeyStmt.exec uteQuery();
This will also return 102 !
Am I missing something here?
Comment