redis与mysql事务比较

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的悲观锁,会锁住资源,其他客户端不能修改数据,直到事务结束释放锁。

posted @ 2017-09-26 15:30  java林森  阅读(1364)  评论(0编辑  收藏  举报