【问题标题】:Spring read-only transaction with locked table带有锁定表的 Spring 只读事务
【发布时间】:2013-11-21 17:00:06
【问题描述】:

我的弹簧配置:

  <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 代码,它仍在等待表被解锁。

事务设置为只读,不应该返回数据吗?

谢谢

【问题讨论】:

    标签: java mysql spring transactions spring-jdbc


    【解决方案1】:

    不,因为 WRITE 锁会阻止任何不持有锁的人读取和写入表。如果您改为使用 READ,您将能够执行您的查询。

    顺便说一句,readOnly 直接在数据库中什么都不做,它只是对 ORM 层的一个提示,即事务不应该进行任何写入。

    【讨论】:

    • 那么当数据库中有插入或更新时,它会锁定正在读取的表吗?有什么办法可以避免吗?
    • 是的:根本不启动事务。但是,您的数据处于危险之中。理解这一点需要了解并发编程的基本原理。顺便说一句,根据您使用的数据库引擎,您可能不必锁定整个表,而只需锁定您正在更改的行。 Mysql 的 Innodb 引擎就是这样一种引擎。
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2011-06-07
    • 2021-06-06
    • 2022-01-17
    相关资源
    最近更新 更多