mysql的事务机制到什么时候结束?
今天排查一个问题时发现,执行完MySQL的操作后,执行剩余的redis操作,我的设想是当redis操作失败抛出异常后,MySQL应该执行回滚,但实际上MySQL并没有回滚。是因为MySQL在执行完操作后事务就已经提交了吗,还是说redis的一些事务机制问题不会引起事务回滚。
今天排查一个问题时发现,执行完MySQL的操作后,执行剩余的redis操作,我的设想是当redis操作失败抛出异常后,MySQL应该执行回滚,但实际上MySQL并没有回滚。是因为MySQL在执行完操作后事务就已经提交了吗,还是说redis的一些事务机制问题不会引起事务回滚。
【相关推荐】
Redis 的事务,不支持回滚,所以我自身持有的观点,是认为它不能实现对应 MySQL 同等意义的 ACID,这与《Redis设计与实现》所持有的观点稍有不同。
我们可以说 Redis 可以实现 ACID 的 I,但不能实现ACD,为什么呢?
因为Redis的事务可以保证一个客户端一个事务内部的多个操作之间不被其他客户端的操作或同客户端非同事务操作插入,所以他能保证一定程度的事务隔离性;
Redis的事务无法回滚,所以无法做到要么都成功,要么都失败
因为不支持原子性,所以也无法满足事务的一致性,比如一个场景,用户A要给用户B转200块钱,所以事务中有两个操作,操作A将用户A的余额-200,操作B将用户B的余额+200,但是操作A如果某种原因失败了,因为不支持回滚,所以操作B正确进行而且成功了。那么用户A没有扣钱,而用户B却凭空的多了200块钱
虽然Redis支持持久化,但因为Redis的持久化是异步的,无论是RDB还是AOF的方式,Redis都无法保证将某个时间点的数据一字不差的完全持久化。如果某个时刻Redis崩溃,总是有丢失一小段时间的数据的可能