热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

事务中的数据为空

如何解决《事务中的数据为空》经验,为你挑选了1个好方法。

我的交易有问题.事务中的数据始终为null,并且更新处理程序仅调用一次.该文件说:

为此,您将传递transaction()一个更新函数,该函数用于将当前值转换为新值.如果另一个客户端在成功写入新值之前写入该位置,则将使用新的当前值再次调用更新函数,并将重试写入.这将反复发生,直到您的写入成功而没有冲突,或者您通过不从更新函数返回值来中止事务

现在我知道现在没有其他客户端访问该位置.其次,如果我正确阅读文档,如果无法检索和更新数据,则应多次调用updateCounters函数.

另一件事 - 如果我取出条件if (counters === null),执行将失败,因为计数器是null在随后的尝试中事务完成 - 检索数据并进行更新.

简单的once - set在这个位置工作很好,但它不安全.

请问我错过了什么?

这是代码

self.myRef.child('counters')
  .transaction(function updateCounters(counters){
    if (counters === null) {
      return;
    }
    else {
      console.log('in transaction counters:', counters);
      counters.comments = counters.comments + 1;
      return counters;
    }
  }, function(error, committed, ss){
    if (error) {
      console.log('transaction aborted');
      // TODO error handling
    } else if (!committed){
      console.log('counters are null - why?');
    } else {
      console.log('counter increased',ss.val());
    }
  }, true);

这是该位置的数据

counters:{
  comments: 1,
  alerts: 3,
  ...
}

Kato.. 21

通过undefined在您的if( ... === null )区块中返回,您正在中止交易.因此,它永远不会向服务器发送尝试,永远不会意识到本地缓存的值与远程不同,并且永远不会重试更新的值(来自服务器的实际值).

这是由事实证实committedfalse与错误是null在你的成功的功能,如果交易被中止发生.

交易工作如下:

将本地缓存的值传递给处理函数,如果您从未从服务器获取此数据,则本地缓存的值null(该路径的最可能远程值)

从处理函数获取返回值,如果该值undefined中止事务,否则,创建当前值的哈希值(null)并将该值和新值(由处理函数返回)传递给服务器

如果本地哈希与服务器的当前哈希匹配,则应用更改并且服务器返回成功结果

如果未应用服务器事务,则服务器返回新值,然后客户端再次使用服务器的更新值调用处理函数,直到成功为止

当最终成功,发生不可恢复的错误,或者事务中止(通过从处理函数返回undefined)时,将使用结果调用success方法.

所以为了使这项工作,显然你不能在第一个返回值上中止事务.

实现相同结果的一种解决方法 - 虽然它是耦合的,而不是仅仅使用设计的事务的once('value', ...)高效或适当 - 将事务包装在回调中,这将确保在运行事务之前在本地缓存它.



1> Kato..:

通过undefined在您的if( ... === null )区块中返回,您正在中止交易.因此,它永远不会向服务器发送尝试,永远不会意识到本地缓存的值与远程不同,并且永远不会重试更新的值(来自服务器的实际值).

这是由事实证实committedfalse与错误是null在你的成功的功能,如果交易被中止发生.

交易工作如下:

将本地缓存的值传递给处理函数,如果您从未从服务器获取此数据,则本地缓存的值null(该路径的最可能远程值)

从处理函数获取返回值,如果该值undefined中止事务,否则,创建当前值的哈希值(null)并将该值和新值(由处理函数返回)传递给服务器

如果本地哈希与服务器的当前哈希匹配,则应用更改并且服务器返回成功结果

如果未应用服务器事务,则服务器返回新值,然后客户端再次使用服务器的更新值调用处理函数,直到成功为止

当最终成功,发生不可恢复的错误,或者事务中止(通过从处理函数返回undefined)时,将使用结果调用success方法.

所以为了使这项工作,显然你不能在第一个返回值上中止事务.

实现相同结果的一种解决方法 - 虽然它是耦合的,而不是仅仅使用设计的事务的once('value', ...)高效或适当 - 将事务包装在回调中,这将确保在运行事务之前在本地缓存它.


推荐阅读
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
author-avatar
豆豆bo69_550
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有