mysql事务具有原子性,隔离性,一致性的特点。
redis提供multi, exec,watch来支持事务:
原子性,一致性:
redis保证在multi,exec之间的语句作为一个整体执行,redis在exec后,是无法回滚的,会出现部分成功,部分失败情况。
隔离性(mysql默认可重复读:事务中多次读取同一数据是一致的):
redis的事务类似mysql的串行化隔离界别,执行期间不会乱入其他语句。redis在事务使用乐观锁。
redis通过watch来监测数据,在执行exec前,监测的数据被其他人更改会抛出错误,取消执行。而exec执行时,redis保证不会插入其他人语句来实现隔离。(可以预见到此机制如果事务中包裹过多的执行长指令,可能导致长时间阻塞其他人)
mysql的事务默认可重复读级别,串行化隔离级别可以防止幻读,由于redis事务中事务中查询指令无效,故不存在这类问题,mysql事务中可以有其他人的语句乱入,mysql通过加锁方式,保证被锁的资源不会被其他人存取,保证事务全程可重复读。
(比如mysql通过select for update对读取的数据行进行加锁,可以防止事务提交前数据被其他人修改,而对于读,允许其他人的select,但是其他人的select for update 则不允许(这种方式不会长时间挂起其他客户端,但是又会有锁?))
锁方式:
redis使用的是乐观锁方式,这种方式允许exec前修改,这时会触发异常通知。mysql的悲观锁,会锁住资源,其他客户端不能修改数据,直到事务结束释放锁。