2013-11-21 73 views
0

我的Spring配置:春只讀鎖住表交易

<jee:jndi-lookup id="testDataSource" jndi-name="java:testDS" /> 

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="testDataSource" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

我的Java方法:

@Transactional(readOnly = true) 
public List find() { 
    jdbcTemplate.query("SELECT * FROM my_table;"); 
} 

如果我下面直接使用腳本的數據庫(MySQL)上:

LOCK TABLES my_table WRITE; 

然後嘗試用只讀事務運行java代碼,它仍然在等待表unl ocked。

它不應該返回數據,因爲事務設置爲只讀?

感謝

回答

1

沒有,因爲寫鎖可以防止讀取和寫入任何人到一個表中沒有持有該鎖。如果您將READ放入,您將能夠執行查詢。

順便說一下,readOnly不直接在數據庫中做任何事情,它只是ORM層的一個暗示,事務不會做任何寫入。

+0

因此,當數據庫中存在插入或更新時,它將鎖定表以進行讀取?有什麼辦法可以避免它? –

+0

是的:根本不開始交易。但是,那麼你的數據處於危險之中。瞭解這一點需要了解併發編程的基本原理。順便說一句,取決於你使用的數據庫引擎,你可能不需要鎖定整個表格,而只能鎖定你正在改變的行。 Mysql的Innodb引擎就是這樣一個引擎。 – miljanm