2013-11-21 75 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