首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自定义类型总是更改记录,使其变脏

基础概念

在软件开发中,"脏"(Dirty)通常指的是数据在内存中被修改但尚未持久化到数据库中的状态。自定义类型(Custom Types)是指开发者根据业务需求自定义的数据类型,它们可以扩展或封装标准数据类型的功能。

相关优势

自定义类型的优势包括:

  1. 代码复用:通过自定义类型,可以减少重复代码,提高代码的可维护性。
  2. 类型安全:自定义类型可以提供更严格的类型检查,减少运行时错误。
  3. 业务逻辑封装:自定义类型可以封装复杂的业务逻辑,使代码更加清晰和易于理解。

类型

自定义类型可以分为以下几种:

  1. 结构体(Structs):用于描述具有不同属性的复合数据类型。
  2. 枚举(Enums):用于定义一组有限的命名常量。
  3. 类(Classes):用于实现面向对象编程中的对象模型。
  4. 接口(Interfaces):用于定义一组方法签名,实现多态性。

应用场景

自定义类型广泛应用于各种场景,例如:

  • 数据库模型定义
  • API响应格式
  • 复杂业务逻辑处理

问题分析

当自定义类型总是更改记录,使其变脏时,可能是由于以下原因:

  1. 数据绑定问题:自定义类型与数据库记录之间的绑定不正确,导致每次访问时都会触发修改。
  2. 生命周期管理问题:自定义类型的生命周期管理不当,导致数据在不应该被修改的时候被修改。
  3. 并发问题:多个线程或进程同时访问和修改数据,导致数据状态不一致。

解决方法

  1. 检查数据绑定: 确保自定义类型与数据库记录之间的绑定是正确的。可以使用ORM(对象关系映射)工具来简化这一过程。
  2. 检查数据绑定: 确保自定义类型与数据库记录之间的绑定是正确的。可以使用ORM(对象关系映射)工具来简化这一过程。
  3. 生命周期管理: 确保自定义类型的生命周期管理正确,避免在不应该修改数据的时候进行修改。
  4. 生命周期管理: 确保自定义类型的生命周期管理正确,避免在不应该修改数据的时候进行修改。
  5. 并发控制: 使用锁或其他并发控制机制来确保数据的一致性。
  6. 并发控制: 使用锁或其他并发控制机制来确保数据的一致性。

参考链接

通过以上方法,可以有效解决自定义类型总是更改记录,使其变脏的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SAP MM 自定义条件类型出现在采购信息记录的条件界面里 ?

SAP MM 自定义条件类型出现在采购信息记录的'条件'界面里 ? 我在SAP系统里复制某个标准的采购条件类型,创建了一个新的自定义条件类型ZC05,并将其分配采购定价过程RM0000。...结果却出现一个怪现象:在ME11/ME12/ME13去维护采购信息记录的时候,当点击'条件'按钮后,该条件类型与条件类型PB00一起出现在一个小窗口里,如下图: ?...解决办法: 1)Condition Type ZC05 配置主界面,存储顺序不能用0002(我复制标准条件类型的时候,从标准条件类型里复制过来的),改用一个自定义的存取顺序Z015, ? ?...此时再去ME13看信息记录条件数据, ? ? 不再出现那个小窗口,而是直接切换到我们熟悉的界面上了,如上图。 问题就解决了! 2019-12-06 写于苏州市。

60010

SAP MM 自定义条件类型出现在采购信息记录的条件界面里 ?

SAP MM 自定义条件类型出现在采购信息记录的'条件'界面里 ? 我在SAP系统里复制某个标准的采购条件类型,创建了一个新的自定义条件类型ZC05,并将其分配采购定价过程RM0000。...结果却出现一个怪现象:在ME11/ME12/ME13去维护采购信息记录的时候,当点击‘条件’按钮后,该条件类型与条件类型PB00一起出现在一个小窗口里,如下图: 类似的界面也出现在合同单据里,当我们选中某个...解决办法: 1)Condition Type ZC05 配置主界面,存储顺序不能用0002(我复制标准条件类型的时候,从标准条件类型里复制过来的),改用一个自定义的存取顺序Z015, 问题就解决了!...此时再去ME13看信息记录条件数据, 不再出现那个小窗口,而是直接切换到我们熟悉的界面上了,如上图。 2019-12-06 写于苏州市。

49500
  • 淘宝暑期实习一面:讲讲分代收集与三个分代假说

    依据这条假说,我们就不必为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结构,这个结构被称为 记忆集 ,Remembered...为了避免伪共享问题,一种简单的解决方案就是更改下写屏障的执行逻辑,在将卡表元素变脏之前,加个判断,就是先检查下卡表标记,只有当该卡表元素未被标记过时才将其标记为变脏。...换句话说,在对象赋值的那一刻,谁来把卡表元素变脏呢?...在 HotSpot 虚拟机里是通过 写屏障(Write Barrier)技术维护卡表状态的 写屏障可以看作虚拟机层面对 “引用类型字段赋值” 这个动作的 AOP 切面,在引用对象赋值时会产生一个环形通知...为了避免伪共享问题,一种简单的解决方案就是更改下写屏障的执行逻辑,在将卡表元素变脏之前,加个判断,就是先检查下卡表标记,只有当该卡表元素未被标记过时才将其标记为变脏 JDK 7 之后 HotSpot 虚拟机增加了一个新的参数

    36820

    GC面临的困境,JVM是如何解决跨代引用的?

    记忆集 记忆集位于新生代中,是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。用以避免把整个老年代加进GC Roots扫描范围。...那设计者在实现记忆集的时候,便可以选择更为粗犷的记录粒度来节省记忆集的存储和维护成本,下面列举了一些可供选择(当然也可以选择这个范围以外的)的记录精度: 图片 其中,第三种「卡精度」所指的就是「卡表」的方式去实现记忆集...何时变脏?谁来把它们变脏? 图片 HotSpot解决的办法是使用写屏障。...写屏障 先来解决何时变脏的问题,这个问题很简单,即其他分代区域中对象引用了本区域对象时,其对应的卡表元素就应该变脏变脏时间点原则上应该发生在引用类型字段赋值的那一刻。...写屏障可以看作在虚拟机层面对「引用类型字段赋值」这个动作的AOP切面,在引用对象赋值时会产生一个环形(Around)通知。用过Spring的弟兄们对AOP肯定不陌生。

    35230

    GC面临的困境,JVM是如何解决跨代引用的?

    记忆集 记忆集位于新生代中,是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。用以避免把整个老年代加进GC Roots扫描范围。...那设计者在实现记忆集的时候,便可以选择更为粗犷的记录粒度来节省记忆集的存储和维护成本,下面列举了一些可供选择(当然也可以选择这个范围以外的)的记录精度: 其中,第三种「卡精度」所指的就是「卡表」的方式去实现记忆集...何时变脏?谁来把它们变脏? HotSpot解决的办法是使用写屏障。...写屏障 先来解决何时变脏的问题,这个问题很简单,即其他分代区域中对象引用了本区域对象时,其对应的卡表元素就应该变脏变脏时间点原则上应该发生在引用类型字段赋值的那一刻。...写屏障可以看作在虚拟机层面对「引用类型字段赋值」这个动作的AOP切面,在引用对象赋值时会产生一个环形(Around)通知。用过Spring的弟兄们对AOP肯定不陌生。

    20420

    JVM笔记-HotSpot的算法细节实现

    一旦类加载动作完成,HotSpot 就会把对象内什么偏移量上是什么类型的数据计算出来(在即时编译过程中,也会在「特定的位置」记录下栈和寄存器中哪些位置是引用),这样收集器在扫描时就能直接得知这些信息,不必挨个从方法区等...一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在跨代指针,就将对应卡表的数组元素的值标识为 1,称为该元素变脏(Dirty),若无则标识为 0. 4.4 卡表的维护 卡表什么时候变脏...谁来把它变脏呢? 何时:当有其他分代区域中的对象引用了本区域对象时,其对应的卡表元素就应该变脏。 如何变脏:HotSpot 虚拟机是通过写屏障实现的。 下面介绍什么是写屏障。 5....写屏障 5.1 简述 写屏障(Write Barrier)可以看做在虚拟机层面对“引用类型字段赋值”动作的 AOP 切面,赋值前的写屏障称为“写前屏障(Pre-Write Barrier)”,赋值后的写屏障称为...5.1.2 如何避免 如何避免“伪共享”问题:不采用无条件写屏障,而是先检查卡表标记,仅当该卡表元素未被标记过时才将其标记为变脏

    1K10

    浅谈Java虚拟机(HotSpot)的内存回收相关细节

    一旦类加载动作完成的时候,HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来, 在即时编译过程中,也会在特定的位置记录下栈里和寄存器里哪些位置是引用。...卡表元素如何维护:写屏障 我们已经解决了如何使用记忆集来缩减GC Roots扫描范围的问题,但还没有解决卡表元素如何维护的问题,例如它们何时变脏、谁来把它们变脏等。...卡表元素何时变脏的答案是很明确的——有其他分代区域中对象引用了本区域对象时, 其对应的卡表元素就应该变脏变脏时间点原则上应该发生在引用类型字段赋值的那一刻。...写屏障可以看作在虚拟机层面对“引用类型字段赋值”这个动作的AOP切面,在引用对象赋值时会产生一个环形(Around)通知, 供程序执行额外的动作, 也就是说赋值的前后都在写屏障的覆盖范畴内。...以上无论是对引用关系记录的插入还是删除, 虚拟机的记录操作都是通过写屏障实现的。

    48220

    JVM 系列(4) —— HotPots 的内部细节

    为了避免在查找引用链的过程中从上到下一个不漏的检查所有执行完的上下文和全局引用的位置这一耗时耗力的情况出现,在类加载完成后, HotSpot 会把对象内什么偏移量上是什么数据类型全部计算出来,并将引用在栈里和寄存器里的位置记录在...也就是说记忆集并非要将每一个指针都记录下来,因此记忆集也有精度之分。 记忆集的精度有: 字长精度:每个记录都精确到每一个机器字长,即该物理内存的地址包含跨代指针。...对象精度:每个记录都精确到一个对象,即该对象中含有跨代指针。 卡精度: 每个记录精确到一块内存区域,该区域内含有跨代指针。 使用卡精度的记忆集称之为卡表,被映射的一块内存区域称之为卡页。...卡表元素的维护与写屏障 在有其他分区元素引用该分区对象时,卡表元素就会变脏变脏的时间点就在引用字段类型赋值的那一刻。...卡表元素维护的方式是写屏障,写屏障可以看做是虚拟机层面对于“引用字段类型赋值”操作的 AOP 切面,赋值前的动作称为“写前屏障”,复制后的动作称为“写后屏障”。

    37010

    《深入理解Java虚拟机》读书笔记(六)

    以便直接得到那些地方存放着对象的引用;在HotSpot虚拟机的解决方案里,使用了一组称为OopMap的数据结构来达到这个目的在HotSpot虚拟机中,一旦类加载动作完成的时候,HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来...,只要卡页内有一个对象字段存在着跨代引用,那么就将对应的卡表的数组元素值标识为1,称为这个元素变脏(通过写屏障维护),在垃圾收集时,只需要筛选出卡表中变脏的元素,就能轻易得出哪些卡页内存块中包含跨代指针...,把它们加入GC Roots中一并扫描写屏障写屏障(Write Barrier),是HotSpot虚拟机里用于维护卡表状态(变脏)的技术,可以看作是虚拟机层面对“引用类型字段赋值”这个动作的AOP切面,...“伪共享”(缓存一致性协议)问题产生消耗,在JDK7之后,提供了-XX:+UseCondCardMark参数,用以让虚拟机不采用无条件的写屏障,而是先检查卡表标记,只有当该卡表未被标记过时才将其标记为变脏并发的可达性分析上文提到可达性分析的根节点枚举还始终必须保障在一个一致性快照中进行...,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次原始快照破坏第二个条件:当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根

    47130

    JVM垃圾回收 - HotSpot的算法细节实现

    执行指令后,在特定位置记录OopMap信息,这些位置成为安全点。...8、卡表 卡表是记忆集的一种具体实现,它定义了记忆集的记录精度、与堆内存的映射关系等。...9、卡页 hotSpot中每个卡页都是512字节,每个卡页包含不止一个对象,只要有一个存在跨代指针,那么卡表的数组元素的值则为1,成为变脏,否则为0。...垃圾回收时,筛选出变脏的元素,加入到GC Roots一起进行扫描。...10、写屏障 维护卡表状态 写屏障可以看作在虚拟机层面对"引用类型字段赋值"这个动作的AOP切面,在引用对象赋值时会产生一个环形通知,供程序执行额外的动作 G1之前都是写后屏障,在执行引用字段赋值后

    30420

    PHP在线图像编辑器 Pixie v3.0.3

    主题化–轻松更改所有编辑器颜色,使其与您现有的站点或应用程序设计相匹配。 可自定义的UI –通过显示,隐藏或添加新菜单项,更改工具栏位置或使用其他主题来自定义UI。...裁剪–将照片裁剪为指定的纵横比之一,或者让用户通过UI选择自定义裁剪区域。 绘图–强大的免费绘图工具同时支持鼠标和触摸,具有多种笔刷类型,颜色等。 文本–完全支持将文本添加到图像。...可以使用数百种Google字体,也可以仅使用自定义添加的字体。 形状–只需指定svg图像路径,即可轻松添加自定义形状。 贴纸–可以添加或删除自定义贴纸。任何类型的图像都可以用作标签。...空画布– Pixie不必编辑现有照片,也可以轻松地从头开始创建自定义图像。 历史记录–所有编辑器操作都是非破坏性的,可以通过历史记录工具轻松撤消和重做。...对象–所有对象(如贴纸,形状和文本)都位于各自的图层上,可以通过更改其颜色,添加阴影,背景等内容轻松地移动,调整大小,删除和修改。 模式和渐变–所有对象都可以使用许多内置或自定义模式和渐变填充。

    2.9K70

    PostgreSQL多主复制方案

    由于硬件成本以及在现有节点中添加新硬件的限制,不可能总是靠添加新硬件资源来解决数据库性能瓶颈,因此,水平扩展成为解决性能瓶颈的另一种可选方案。...PostgreSQL并发执行的特性使其在垂直扩展上更加突出,同时也不缺乏水平扩展性。复制功能是PostgreSQL水平扩展的核心,目前支持的单向主从复制已经能够解决大多数应用场景。...它总是在两台服务器上运行,在Rubyrep术语中被称为“左”和“右”。因此,将其称为主主架构更合适,而不是多主架构。...预构建冲突解决方法:左/右获胜,早期/后期更改获胜 可通过ruby代码段指定的自定义冲突解决方案 复制决策可以选择性地记录在rubyrep事件日志表中 注:就发展而言,该项目在过去三年中一直不活跃。...表上发生的更改记录在表(bucardo_delta)中,并通知守护进程。守护进程通知控制器启动“kid”以同步表更改。如果存在冲突,则使用标准或自定义冲突处理程序对其进行处理。

    4.3K60

    Unity基础教程系列(新)(一)——游戏对象和脚本(Creating+a+Clock)

    还要将其Z位置更改为-0.35,使其位于小时臂的顶部。请注意,这适用于手臂,而不是其枢轴。 ? (调整分针的Transform) 调整秒针。...(Project窗口下的Material 文件夹) 3 时钟动起来 目前,我们的时钟无法显示时间,它总是停留在十二点钟。要对其进行动画处理,我们需要为其添加自定义行为。...如果要保存文件并返回到Unity编辑器,则编译错误将记录在其控制台窗口中。 编译器指出我们正在定义一个类型,因此我们实际上必须定义它的类型。这是通过声明后的代码块完成的。代码块的边界用大括号表示。...要将Clock转换为MonoBehaviour的子类型,我们需要更改类型声明,以使其继承自该类型,这是在类型名称后加冒号,然后再继承其内容。...(在播放模式下总是1点) 如果相机未聚焦在时钟上,则可以移动它以使时钟可见,但请记住,退出播放模式时会重置场景,因此在播放模式下对场景所做的任何更改都不会持久 。

    4.3K20

    C#简化让你懂得构建平台的第二定律

    根据系统提供的复杂性的类型,一个或多个客户可能会要求针对其用例的原始行为的变化。我们可以轻松想象在B2B软件中出现的这种情况,其中每个客户都需要原始功能的某些自定义变体。 我们如何适应这些情况?...但是,如果不是这种情况,原始团队将成为多个团队的瓶颈,因为它无法节省时间来处理所有传入的自定义请求。 第二种方法是要求客户团队进入代码库并自己进行更改。这消除了带宽瓶颈。...客户开发人员通常可以在给定足够足够的工具/文档和指南(代码审查等)的情况下进行更改。但是随着时间的流逝,这几乎总是导致代码质量下降和所有权模糊。...1.客户确切知道如何挂接到自定义行为,因为系统的设计使其变得明确。它们没有进入系统内部并被错误破坏的风险。 2.这也使客户端的更改速度更快,因为他们不必学习如何在新的代码库中工作。...我们刻意公开许多系统内部信息以进行自定义,这样我们就不必将整个系统暴露于侵入性的变化中。 如果我们看一下传统的分层体系结构样式,则控制总是从较高层流向较低层。

    31420

    ​如何自动化Salesforce应用程序

    自动执行此操作可能会出现问题,因为此技术允许将隐藏的DOM树与标准DOM中的元素相关联,这意味着许多元素不易用于创建“点击”类型的脚本。 开发人员还经常添加自定义HTML标签。...Selenium无法直接识别自定义Shadow DOM HTML标签。...TestProject如何处理动态元素 TestProject还简化了针对生成每次运行都会更改的动态元素的应用程序(例如Salesforce中的应用程序)的测试用例记录。...因此,由于所有ID均已更改,因此在运行测试时它将失败。 要查看实际效果,请观看我确实展示了AI记录器如何针对动态值工作的视频。...在运行期间,记录器使用AI处理元素ID的任何更改,以识别与之交互的正确字段而不会失败。 为什么要使用TestProject? 如果您知道如何编码,则可以编写任何代码。你想做什么,就可以做什么。

    1.5K30

    字段历史追踪的高级版本

    Salesforce字段历史追踪是一个非常好的内置功能,但是它并不能总是满足业务需求,在报表中显示历史数据的时候也不是很灵活。...结果就是,一个新的记录将会被创建也会计算到数据存储限制中。所以请注意这个方案可能并不适合所有的企业。 1. 创建自定义对象 一开始,我们需要创建一个自定义对象并将之关联到我们希望跟踪的历史的对象下。...因为当用户更改记录的时候会触发Process Builder,在业务机会字段历史对象中的Created by字段将会记录更新业务机会记录的用户信息,所以无需再创建一个自定义的字段去捕获此信息 我选择Master-Detail...我选择了第一个,不管我们有多少字段更改了,Process Builder可以更简单的在未来添加或移除字段。...6.在Immediate Actions 区域点击+ Action并在事件类型中选择Create a Record 7.给Action起一个名字,对于记录类型,选择新创建的叫Opportunity Field

    78430

    Java中的可变对象(Mutable)与不可变对象(Immutable)

    我以前以为所有对象都是不可变的,因为如果你改变一个 String 实例的内容,它总是会创建一个新的 String 对象并指向该对象。...但这鼓励我学习更多有关 Java 中Immutable和Mutable类的知识,以及如何在 Java 中创建自定义的Immutable。...this.customInt = customInt; //customInt can be set } } 不可变类应被标记为 final 类,这样它们就不能被扩展,但仅仅使类成为 final 类并不能使其成为不可变类...要使对象不可变,请确保它们只有非数组的final字段(在 Java 中数组总是可变的),并且所有字段类型也只有final字段。...另一方面,不可变对象通常是线程安全的,因为状态不能更改并且可以在多个线程之间安全共享。  3. 状态更改 可变对象允许更改状态,但不可变对象的状态在创建时是固定的。 4.

    34630

    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA...

    这是一个MySQL自定义函数的报错信息。...这个警告是因为您的函数没有指定 DETERMINISTIC、NO SQL 或 READS SQL DATA 中的任何一个,而且二进制日志记录已启用。...这意味着您的函数可能会对数据进行更改,但 MySQL 不知道它是否会更改数据,因此会发出警告。...这些关键字告诉 MySQL 函数的行为方式,从而使其能够更好地优化查询和避免不必要的警告。 如果您的函数不会更改数据,则可以将其声明为 NO SQL。...小小结语 各个数据库之间的差异挺大的,甚至是SQL的使用,更别说自定义函数这些了。 以下是一篇关于MySQL自定义函数讲解很好的文章(至少我认为),很容易学会简单基础的自定义函数。 跳转链接在此

    56240

    Salesforce的对象简介

    自定义对象—可自定义创建去存储其他类型的数据。自定义对象拓展了标准对象的功能。例如,如果你想创建一个应用去跟踪库存,你可以创建叫Merchandise 和Invoice的两个自定义对象。...无论是标准还是自定义对象,Force.com对象不仅提供数据存储的结构而且允许用户与数据进行交互,如更改标签,页面上的字段布局,以及相关信息等等。...记录的名称是一个人类可识别的标识符。他不需要唯一的表示符,但是他区分两个记录的主要方法。在自动生成的用户界面,你将会看到名字的值总是显示成一个链接并关联此条记录本身。...每创建一个记录,自动数字字段就会增长 自定义字段 你可以定义自定义字段,无论是拓展标准对象的功能还是当创建一个新的自定义字段。所有在对象中的字段都必须定义一个特定的数据类型。...这个相关列表跟踪了变化的日期、时间、性质和谁做了更改等。 安全-数据库服务提供了非常灵活的安全模型,你可以使用它来控制哪些用户可以访问对象,记录或字段。

    1.8K30
    领券