@Transactional修饰查询方法,会加锁吗?

@transactional修饰查询是否会加锁?

在使用@Transactional注解修饰查询时,就其加锁行为而言,需要根据它所应用的隔离级别来判断。

隔离级别对加锁行为的影响

在MySQL中,@Transactional支持的隔离级别主要有以下几种:

  • 串行化(SERIALIZABLE):最高隔离级别,会针对所有查询动作进行加锁,保证数据的串行化。
  • 可重复读(REPEATABLE READ):保证在事务执行期间,不会读到其他事务已提交但未提交的数据,但可能会存在幻读问题。不会加锁。
  • 读已提交(READ COMMITTED):保证只读到其他事务已提交的数据,但可能会出现不可重复读和幻读问题。不会加锁。
  • 读未提交(READ UNCOMMITTED):可能会读到其他事务未提交的数据,可能会出现脏

    读、不可重复读和幻读问题。不会加锁。

因此,如果使用@Transactional修饰的查询中没有增删改动作,在以下隔离级别下会发生加锁行为:

  • 串行化:会加锁,保证数据的串行化。
  • 其他(可重复读、读已提交、读未提交):不会加锁。