konto usunięte
Temat: Poziom izolacji - nie działa ? Hibernate,PostgreSQL....
Mam pytanie.Mam proces rejestracji ... przycisk zakończ uruchamia metodę serwisową.
Trasnsacional
createAccount(){
sprawdzczykontoJusIstnieje() - zapytanie do bazy (Transactional(readOnly)
jesli nie to wstaw dane do bazy - zapisz
}
Póki co mogę kilknąć w przycisk zapisz np 10 razy ... to wywołuje za każdym raze tę metodę
Ustawiełm poziom izolacji na READ_COMMITED transakcja może odczytywać tylko wiersze zapisane.
Ustawiłem propagioion na REQUIRES_NEW - ale to chyba zadziała tylko wtedy, kiedy wywoływałbym metodę z innej klasy, wtedy następuje propagacja.. Spring domyślnie tworzy logiczne transakcjje, a na bazie istnieje jedna fizyczna - REQUIRED
Teraz dzieje się coś dziwnego. Pierwsze wywołanie metody nie zdązy zapisac dane a drugie wywolanie już sprawdza czy takie konto istnieje i przechodzi dalej, Wtedy I wywołanie zapisało dane i drugie próbuje - ale że jako jest unique zalozany na adres email to leci wyjatek.
Nawet przy ustawieniu poziomu SERIALIZABLE tak sie dzieje...
Moze to dzieje sie dlatego, ze Spring zawiesza wywolanie pierwszej metody(transakcji) i rozpoczyna druga?
Spring 3.2.3
Hibernate 4.2.9
PostgreSql 9.2
REJESTRACJA:
REQUEST(POST) ---> Przycisk: Zakończ: x2
T1 : createAccount(User user)
T2: createAccount(User user) . Rozumiem, że T1 i T2 to logiczne transakcje Springa, a w BD jest jedna fizyczna?\
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="packagesToScan" value="com.sharcs.models.database" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.max_fetch_depth">5</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- <prop key="hibernate.generate_statistics">true</prop> -->
<prop key="hibernate.use_sql_comments">true</prop>
</props>
</property>
</bean>
@Transactional(isolation=Isloation.READ_COMMITTED)
public int createAccount(User user) {
if (isAccountCreated(user.getUserEmail()) == false) {
@Transactional(readOnly=true)
isAccountCreated(Streing email)