【Java】Redis-第六章节-事务

Redis-第六章节-事务

李栋发布于 今天 09:42

目录

  • 简介
  • 执行过程
  • 特点
  • 案例
  • watch

简介

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。

执行过程

开始事务 -> 命令入队 -> 执行事务。

特点

① 批量操作在发送 exec 命令前被放入队列缓存。
② 收到exec命令后进入事务执行,事务中任意命令执行失败,其余的命令依然会被执行。
③ 在事务的执行过程中,其他客户端提交的命令请求不会插入到事务执行命令的序列中。

案例:

  • (1)正常执行

      localhost:6379> multi

    OK

    localhost:6379> set a 1111

    QUEUED

    localhost:6379> set b 2222

    QUEUED

    localhost:6379> set c 3333

    QUEUED

    localhost:6379> set d 4444

    QUEUED

    localhost:6379> exec

    1) OK

    2) OK

    3) OK

    4) OK

  • (2)取消事务

      localhost:6379> multi

    OK

    localhost:6379> set e 55555

    QUEUED

    localhost:6379> set f 66666

    QUEUED

    localhost:6379> discard

    OK

    localhost:6379> exec

    (error) ERR EXEC without MULTI

  • (3)编译型错误
    【Java】Redis-第六章节-事务
    最后执行exec命令之后,会执行队列中的命令,队列中命令有失败的,所以最后整个命令都执行失败。
    编译型异常代码有问题,命令有错,事务中所有的命令都不会被执行。
  • (4)运行时错误

        localhost:6379> set a qqqq

    OK

    localhost:6379> multi

    OK

    localhost:6379> incr a

    QUEUED

    localhost:6379> set b 1111

    QUEUED

    localhost:6379> set c 2222

    QUEUED

    localhost:6379> set d 3333

    QUEUED

    localhost:6379> exec

    1) (error) ERR value is not an integer or out of range

    2) OK

    3) OK

    4) OK

    localhost:6379> keys *

    1) "a"

    2) "c"

    3) "b"

    4) "d"

    如果事务队列存在语法错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常。

watch

Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

  • 监控a时,a被修改

      //客户端1

    localhost:6379> set a 1111

    OK

    localhost:6379> WATCH a

    OK

    localhost:6379> MULTI

    OK

    localhost:6379> set a 2222

    QUEUED

    localhost:6379> exec

    (nil)

    //客户端2

    127.0.0.1:6379> set a 567

    OK

  • 正常watch

      localhost:6379> set a 1111

    OK

    localhost:6379> WATCH a

    OK

    localhost:6379> MULTI

    OK

    localhost:6379> set b 222

    QUEUED

    localhost:6379> set c 333

    QUEUED

    localhost:6379> set d 444

    QUEUED

    localhost:6379> exec

    1) OK

    2) OK

    3) OK

    localhost:6379> keys *

    1) "a"

    2) "c"

    3) "b"

    4) "d"

redisjava

阅读 67发布于 今天 09:42

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

李栋

当你头发花白,我们一起研究Bug可好?

3 声望

0 粉丝

0 条评论

得票时间

avatar

李栋

当你头发花白,我们一起研究Bug可好?

3 声望

0 粉丝

宣传栏

目录

  • 简介
  • 执行过程
  • 特点
  • 案例
  • watch

简介

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。

执行过程

开始事务 -> 命令入队 -> 执行事务。

特点

① 批量操作在发送 exec 命令前被放入队列缓存。
② 收到exec命令后进入事务执行,事务中任意命令执行失败,其余的命令依然会被执行。
③ 在事务的执行过程中,其他客户端提交的命令请求不会插入到事务执行命令的序列中。

案例:

  • (1)正常执行

      localhost:6379> multi

    OK

    localhost:6379> set a 1111

    QUEUED

    localhost:6379> set b 2222

    QUEUED

    localhost:6379> set c 3333

    QUEUED

    localhost:6379> set d 4444

    QUEUED

    localhost:6379> exec

    1) OK

    2) OK

    3) OK

    4) OK

  • (2)取消事务

      localhost:6379> multi

    OK

    localhost:6379> set e 55555

    QUEUED

    localhost:6379> set f 66666

    QUEUED

    localhost:6379> discard

    OK

    localhost:6379> exec

    (error) ERR EXEC without MULTI

  • (3)编译型错误
    【Java】Redis-第六章节-事务
    最后执行exec命令之后,会执行队列中的命令,队列中命令有失败的,所以最后整个命令都执行失败。
    编译型异常代码有问题,命令有错,事务中所有的命令都不会被执行。
  • (4)运行时错误

        localhost:6379> set a qqqq

    OK

    localhost:6379> multi

    OK

    localhost:6379> incr a

    QUEUED

    localhost:6379> set b 1111

    QUEUED

    localhost:6379> set c 2222

    QUEUED

    localhost:6379> set d 3333

    QUEUED

    localhost:6379> exec

    1) (error) ERR value is not an integer or out of range

    2) OK

    3) OK

    4) OK

    localhost:6379> keys *

    1) "a"

    2) "c"

    3) "b"

    4) "d"

    如果事务队列存在语法错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常。

watch

Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

  • 监控a时,a被修改

      //客户端1

    localhost:6379> set a 1111

    OK

    localhost:6379> WATCH a

    OK

    localhost:6379> MULTI

    OK

    localhost:6379> set a 2222

    QUEUED

    localhost:6379> exec

    (nil)

    //客户端2

    127.0.0.1:6379> set a 567

    OK

  • 正常watch

      localhost:6379> set a 1111

    OK

    localhost:6379> WATCH a

    OK

    localhost:6379> MULTI

    OK

    localhost:6379> set b 222

    QUEUED

    localhost:6379> set c 333

    QUEUED

    localhost:6379> set d 444

    QUEUED

    localhost:6379> exec

    1) OK

    2) OK

    3) OK

    localhost:6379> keys *

    1) "a"

    2) "c"

    3) "b"

    4) "d"

以上是 【Java】Redis-第六章节-事务 的全部内容, 来源链接: utcz.com/a/110838.html

回到顶部