我們正在開發Spring 4.0.0,Hibernate 4.2.8和Ms SQL Server 8的應用程序,該應用程序使用由DB表格支持的自定義序列並使用Hibernate映射VO(CustomSequence)使用Spring 4.0和Hibernate 4.2.8更改隔離級別012.8
這個序列服務呼叫內accesed:
- 主要服務啓動它自己的事務
- 執行代碼,做一些事情,查詢...
調用序列服務爲一個序列值(S equenceService)
SequenceService開始了自己的交易(REQUIRES_NEW)
SequenceService找到對象,返回值並保存下一個值
主要服務獲取價值,將業務對象並保存(在此點序列值已經由內新的事務)
- 退出COMMITED
片段,其管理自定義序列的服務的:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
@Service("sequenceService")
public class SequenceService implements ISequenceService {
@Autowired
private ISequenceDao sequenceDao;
private Integer getSequence() {
CustomSequence sequenceOut = sequenceDao.find();
final Integer nextVal = sequenceOut.getNextVal();
sequenceOut.setNextVal(nextVal + 1);
sequenceDao.save(sequenceOut);
return nextVal;
}
}
我們的問題是可序列化的屬性被完全忽略,以便2個併發線程訪問某個getSequence方法,將獲得相同的值。
如果我們檢查與TransactionSynchronizationManager隔離值似乎是正確的序列(值= 8):
...
Integer isolation = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel();
...
我們的Spring XML文件是這個:
<context:annotation-config />
<context:component-scan base-package="dev.app"/>
<tx:annotation-driven />
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/appDatasource"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="false" >
<property name="dataSource"> <ref bean="dataSource" /></property>
<property name="packagesToScan" value="dev.app.model"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- Disable LOB creation as connection -->
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
</props>
</property>
</bean>
我檢查了數據庫序列化MS SQL Management Studio與這些命令的能力,然後執行應用程序代碼,它的工作(阻止代碼,直到工作室提交):
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
UPDATE CUSTOM_SEQUENCE set NEXTVAL = 1000;
WAITFOR DELAY '00:1:00'
COMMIT
¿發生了什麼事情的線索?我已經閱讀了很多互聯網上的信息,但無濟於事
很多預先致謝!
感謝您的回答。我已經調試了這個類,它看起來一切正常,因爲這個標誌並沒有改變(真正的值),並且isSameConnectionForEntireSession(session)的值也是如此。它輸入DataSourceUtils.prepareConnectionForTransaction(con,定義)並將當前隔離設置爲8(以前的隔離爲2)。內部事務結束後,執行恢復以前的隔離值(2)的「doCleanupAfterCompletion」。我只是不知道這裏出了什麼問題。 – pollytronman
我認爲問題與服務器有關。從零開始重新部署在全新的服務器上解決了問題... – pollytronman