I am using JdbcTemplate from Spring framework.
The database is Oracle.
Simplified Code:
void m() {
setAutocommit(false); // the same result with/without this line (by default: true )
JdbcTemplate jt;
...
String selectForUpdateLine = "SELECT X FROM T ... FOR UPDATE";
int x = jt.queryForList(selectForUpdateLine, objs, types, Smth.class).size();
...
addDelay(); // to be sure that I can simulate 2 consecutive SELECTs (just for test)
...
if ( x == 0 )
jt.update(insertLine, objs2, types2); // insert
else
jt.update(updateLine, objs2, types2); // update
}
If I call m()
twice it executes:
SELECT > SELECT > INSERT/UPDATE > INSERT/UPDATE
but I want to have
SELECT > INSERT/UPDATE > SELECT > INSERT/UPDATE
I expected to have a lock after the first SELECT
( on the strengths of SELECT ... FOR UPDATE
), but both selects are called, so the UPDATE/INSERT
doesn't work well.
I also tried to use @Transactional
for the method, trying to have a single transaction that contains both INSERT
and UPDATE/INSERT
, but it didn't work.
E.g.:
@Transactional(isolation=Isolation.SERIALIZABLE,propagation=Propagation.REQUIRES_NEW)
How can I be sure that SELECT
and UPDATE/INSERT
will be run together ? (with/without SELECT ... FOR UPDATE
, @Transactional
, etc. )
Aucun commentaire:
Enregistrer un commentaire