Моя конфигурация пружины: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.
Не следует ли возвращать данные, поскольку транзакция задана как доступная только для чтения?
Благодаря
Итак, если в базе данных есть вставка или обновление, она также закроет таблицу для чтения? Есть ли способ избежать этого? –
Да: не начинайте транзакцию вообще. Но тогда ваши данные находятся в опасности. Понимание этого требует знания базовых принципов параллельного программирования. BTW, в зависимости от используемого вами механизма базы данных, возможно, не нужно блокировать всю таблицу, а только строку, которую вы меняете. Двигатель Mysql Innodb - один из таких двигателей. – miljanm