乐观锁:
在数据库中添加一个version字段,在查数据的时候把这个也查出来,更新的时候将这个version字段更新并作为条件。update ... set ... version = version +1 where version = ? ,可以避免例如两个人同时从银行取钱但是两个人共同的花费大于余额的情况.
1、watch:
在redis中,有一个乐观锁更强大的功能,watch。它可以监控某一个键,当事务在齿形的过程中,如果此键代码的值发生变化,则本事务放弃执行。否则正常执行
(1)第一个连接
set version 1
set balance 100
set balance1 1000
watch version
multi
decrby balance 50
incrby balance1 50
exec(在第二个连接执行完后再执行)
(2)第二个连接
incr version
2、unwatch:放弃监控所有的键
3、小结
(1)单独的隔离操作:事务的所有命令都会被序列化,顺序的执行。事务在执行的过程中,不会被其他客户端发来的命令请求所打断(watch除外)
(2)不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis的事务没有回滚。Redis已经在系统内部进行功能简化。这样可以确保更快的运行速度。因为Redis不需要事务回滚的功能