2013-11-21 3 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-код с транзакцией только для чтения, он все еще ждет, когда таблица будет неактивной ocked.

Не следует ли возвращать данные, поскольку транзакция задана как доступная только для чтения?

Благодаря

ответ

1

Нет, потому что блокировка WRITE предотвращает чтение и запись в таблицу из тех, кто не держит замок. Если вы поместите READ вместо этого, вы сможете выполнить свой запрос.

BTW, readOnly ничего не делает в базе данных напрямую, это всего лишь намек на уровень ORM, который, как ожидается, не будет делать транзакция.

+0

Итак, если в базе данных есть вставка или обновление, она также закроет таблицу для чтения? Есть ли способ избежать этого? –

+0

Да: не начинайте транзакцию вообще. Но тогда ваши данные находятся в опасности. Понимание этого требует знания базовых принципов параллельного программирования. BTW, в зависимости от используемого вами механизма базы данных, возможно, не нужно блокировать всю таблицу, а только строку, которую вы меняете. Двигатель Mysql Innodb - один из таких двигателей. – miljanm

Смежные вопросы