面试题---事务相关

事务的隔离级别

指多个并发事务之间互相隔离的程度。在数据库中,为了避免由于并发操作而引起的数据不一致问题,需要使用事务进行隔离。

常见的事务隔离级别有以下四种:

READ UNCOMMITTED(读未提交)

:最低级别的隔离级别,允许一个事务能够读取另一个事务未提交的数据。这种隔离级别会导致脏读、不可重复读和幻读的问题。

READ COMMITTED(读已提交)

:允许一个事务只能看到另一个事务已经提交的数据。这种隔离级别可以避免脏读,但仍然会出现不可重复读和幻读的问题。

REPEATABLE READ(可重复读)

:保证在同一事务中多次读取同样记录时,读到的是同样的数据,即在同一事务中两次执行相同的查询语句,得到的结果集是一样的。MySQL默认的隔离级别就是REPEATABLE READ,并且使用锁机制来解决并发问题。

SERIALIZABLE(串行化)

:最高级别的隔离级别,强制事务串行执行,避免了所有的并发问题。但是,由于需要串行执行,效率非常低下,一般不建议使用。

在Spring中,使用@Transactional注解可以声明一个方法需要在事务环境中运行。可以通过设置isolation属性来指定事务的隔离级别,如:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void updateUserBalance(Long userId, BigDecimal amount) {
        User user = userRepository.findById(userId).orElse(null);
        if (user != null) {
            user.setBalance(user.getBalance().add(amount));
            userRepository.save(user);
        }
    }
}

在这个示例代码中,@Transactional注解被用于updateUserBalance()方法上,并且设置了隔离级别为READ COMMITTED。这种隔离级别将保证当前事务只能看到已提交的数据,可以有效避免脏读的问题。

总之,在进行并发操作时,需要使用事务进行隔离,并根据实际需求选择合适的隔离级别,以避免数据不一致的问题。

脏读、不可重复读和幻读

并发访问数据库时可能出现的问题。它们的主要区别在于读取到的数据是否一致。

脏读

:当一个事务读取到另一个事务未提交的数据时,称为脏读。脏读可能会导致数据不一致。

不可重复读

:当一个事务在读取同一数据的过程中,多次读取的结果不一致时,称为不可重复读。不可重复读可能会导致数据不一致。

幻读

:当一个事务读取了另一个事务新增或删除的数据时,称为幻读。幻读可能会导致数据不一致。

假设

有两个并发事务A和B,事务A执行了createUser()方法新增了一个用户,并且在事务未提交时,事务B执行了getAllUsers()方法查询用户列表。此时,事务B将会读取到事务A新增的那个用户,产生幻读的问题。

再假设事务A执行了updateUserName()方法重新设置了一个用户的姓名,并且在事务未提交时,事务B执行了两次getAllUsers()方法查询用户列表。此时,第一次查询和第二次查询的结果可能会不同,产生不可重复读的问题。

为避免这些问题,需要使用事务和适当的隔离级别进行隔离和管理,并根据实际场景来选择合适的隔离级别,保证数据的一致性和正确性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值