Desde mi código (Java) Deseo asegurarme de que exista una fila en la base de datos (DB2) después de que se ejecute mi código.¿Tiene DB2 una instrucción "insertar o actualizar"?
Mi código ahora hace un select
y si no se devuelve ningún resultado, hace un insert
. Realmente no me gusta este código ya que me expone a problemas de concurrencia cuando se ejecuta en un entorno de subprocesos múltiples.
Lo que me gustaría hacer es poner esta lógica en DB2 en lugar de en mi código de Java. ¿Tiene DB2 una declaración insert-or-update
? ¿O algo así que pueda usar?
Por ejemplo:
insertupdate into mytable values ('myid')
Otra forma de hacerlo sería probablemente de hacer siempre el inserto y captura "de SQL de código -803 clave primaria ya existe", pero me gustaría evitar que, si es posible .
¿No sería mejor tener una transacción por hilo? DBMS es bueno con múltiples hilos, es por eso que las transacciones fueron inventadas. Ellos resolverían el problema de concurrencia. – bortzmeyer
Eso no resolverá el problema de concurrencia porque las transacciones solo funcionan bloqueando en una fila ya existente.Si la fila no existe, la transacción no puede bloquearlo y este tipo de operación aún está abierto para problemas de concurrencia – Richard