redis事务是一系列redis命令的集合。事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。在执行时不会被其他客户端发来的命令请求打断。
Redis事务可以一次执行多个命令,并且带有以下两个重要特征:
1.事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
2.事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务的运行期间分为两种情况:
1.运行错误:如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不支持回滚。如示例1所示。
2.语法错误:组队中某个命令出现了报告错误,(已经提示错误)再执行时整个的所有队列都会被取消。
在执行EXEC命令之前,客户端可以检查放入队列的命令的返回值,返回值是QUEUE字符,表示正确地将这命令放入队列中,否则Redis返回一个错误。如果是放入队列发生错误,那么中止事务,并丢弃这个事务。如示例2所示。
示例1:

事务中执行的命令 如果有命令执行失败,不具备原子性
示例2:

事务中执行的命令如果有命令错误(语法错误),具备原子性
结论:
redis事务具备原子性。
事务中执行的命令如果有命令错误(语法错误),具备原子性;但是,事务中执行的命令 如果有命令执行失败,不具备原子性,生产阶段很少出现,会通过软件测试避免。
redis中watch使用的是cas算法
CAS(Check ang Set)比较并交换,是一种无锁算法,实现多个线程在操作同一个资源时保持同步性。
实现过程:有几个记录值,分别是旧值、新值和更新值,当要开始操作资源时,先在线程的缓存中记录一个旧值,开始对值进行修改(修改的不是主存,而是缓存)记录到更新值中,在更新主存前,再次读取主存值存到新值中,用新值和旧值比较,如果相同,则将更新值更新到主存中,如果不相同则取消这次操作。
CAS算法适用于计算值、更新值的操作;而线程同步锁(synchronized)适用于只进行过程操作的线程。

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
Redis就是利用这种check-and-set机制实现事务的
定义两个事务, 要求两个事务抢一张车票,其中只能有一个事务抢到票。(ticket用来存储车票)
事务1:

事务1抢到了票。
事务2:
