2016-05-15 19 views
0

das folgende Szenario Gegeben: Ich habe eine App mit Frühlings-Boot-@SpringBootApplication und Setup mit Spring Data JPA-Datenquelle in application.properties ausgeführt wird:Spring Data JPA Transaktion individuelle Isolationsstufe

spring.datasource.url=jdbc:mysql://foo.bar.com:12345 
spring.datasource.username=user 
spring.datasource.password=password 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

und keine zusätzlichen java/xml configs.

Ich habe ein paar von Dienstleistungen an:

@Service 
public class ProjectServiceImpl implements ProjectService { 

    @Autowired 
    ProjectRepository projectRepository; 

    @Override 
    @Transactional(isolation = Isolation.SERIALIZABLE) 
    public Project save(Project project) { 
     // there might be some additional logic here, besides the action on repository 
     return projectRepository.save(project); 
    } 
} 

und Repositories:

@Repository 
public interface ProjectRepository extends CrudRepository<Project, Long> {} 

Wie oben im Code ist, fand ich mich in der Notwendigkeit, sagen wir mal, SERIALIZABLE Niveau der Isolation durch dass die App horizontal skaliert wird und gelegentlich widersprüchliche Daten in der Datenbank gespeichert werden (einfach @Transactional war nicht genug). Nun, wenn sie versuchen, versuche ich projectService.save(project) Aktion auszuführen ich eine Ausnahme erhalten:

"exception": "org.springframework.transaction.InvalidIsolationLevelException", 
"message": "JtaTransactionManager does not support custom isolation levels by default - switch 'allowCustomIsolationLevels' to 'true'", 

Ist es möglich, diese individuelle Isolationsstufen mit einem Java-Config zu aktivieren?

Antwort

0

Sie können allowCustomIsolationLevels aktivieren, indem Sie unten in TransactionManager

transactionManager.setAllowCustomIsolationLevels(true); 
+0

Meine Frage Einstellung wurde mehr auf die Tatsache, dass ich beziehe weiß nicht, wie 'tramsactionManager' zugreifen zu können, diesen Wert setzen. Kann es irgendwie mit '@ EnableTransactionManagement' gemacht werden? – Jakubs

+1

Sie werden einen transactionManager in applicationcontext.xml oder einer anderen XML-Datei definieren. Bitte setzen Sie in der Bean-Definition von transactionManager. – shankarsh15

+0

Der Fall ist, ich verwende keine xml-basierte Federkonfiguration. Ist es möglich mit java config zu arbeiten? – Jakubs