一个带where条件的读数据库的函数在使用 @Transactional(isolation = Isolation.REPEATABLE_READ) 注解时,假设当前根据where条件正在读a表中的第1~3行数据,按注解来说当下是不允许修改操作的,那具体是仅锁了1~3行还是整个表都不能修改?(仅1~3行数据不可修改,还是整个表不可修改?)
时间: 2023-05-15 07:04:59 浏览: 97
根据 @Transactional(isolation = Isolation.REPEATABLE_READ) 注解的设定,当前读取的数据行会被锁定,其他事务无法修改这些数据,但是整个表并不会被锁定,其他事务仍然可以修改表中未被锁定的数据行。因此,仅锁定了1~3行数据,而整个表并不会被锁定。
相关问题
@Transactional(isolation = Isolation.REPEATABLE_READ) 的原理是悲观锁吗
@Transactional(isolation = Isolation.REPEATABLE_READ) 的原理是基于数据库的悲观锁机制实现的。它会在事务开始时获取一个共享锁,保证在事务结束前,其他事务不能对该数据进行修改。
@Transactional isolation
在 Spring Framework 中,@Transactional 注解可用于设置事务的隔离级别。事务的隔离级别定义了多个事务并发执行时彼此之间的可见性和影响程度。
常见的事务隔离级别有:
1. DEFAULT(默认):使用数据库默认的隔离级别。
2. READ_UNCOMMITTED(读未提交):允许脏读、不可重复读和幻读。
3. READ_COMMITTED(读已提交):禁止脏读,但是允许不可重复读和幻读。
4. REPEATABLE_READ(可重复读):禁止脏读和不可重复读,但是允许幻读。
5. SERIALIZABLE(串行化):禁止脏读、不可重复读和幻读,最严格的隔离级别。
你可以在 @Transactional 注解中使用 isolation 属性来指定使用的隔离级别。例如,@Transactional(isolation = Isolation.READ_COMMITTED)。这将确保在事务中使用读已提交的隔离级别。
需要注意的是,隔离级别越高,对数据库的性能影响越大。因此,在选择隔离级别时需要权衡数据一致性和性能之间的关系。
阅读全文