During development for a solution based on Spring+JPA+MySQL/Oracle we came across two settings to watch for.
1. Database isolation level
The default isolation level in MySQL is REPEATABLE READ, different from the default in Oracle (READ_COMMITTED). It seems this is kept for historical reasons related to the replication. Still, the effect is that for example a database query will return the same result, no matter if some other transaction has meanwhile changed the database.
For checking the current MySQL isolation level: SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
For changing the isolation level add: “transaction-isolation = REPEATABLE-READ” to you MySQL configuration.
2. JPA transaction configuration
For those accustomed to Hibernate default configuration, the default JpaTransactionManager comes with a different default for behavior related to transaction configuration. The “globalRollbackOnParticipationFailure” is set to true, that means a failed transaction will trigger a global rollback. If you want to change that and be the decision maker if the global transaction should be rolled back or not, set globalRollbackOnParticipationFailure to false.