[NewLife.XCode]脏数据

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 729+)

 

什么是脏数据

在XCode中,每次执行实体类更新entity.Update时,都希望只更新修改过的字段,而不是update所有字段

一方面,减少数据库压力以及通信流量;

另一方面,多线程同时更新同一行数据的不同字段,在未加锁的情况下,避免脏写。

 

[NewLife.XCode]脏数据

IsDirty和Dirtys,这是XCode的脏数据,常常出现在Valid中 。

如上图,前者判断Password字段是否有脏数据(Password被赋予跟原来不想等的值),后者清空Password脏数据。

脏数据是生成Update语句的核心,不脏的字段不会出现在update set 之中,从而实现部分字段更新。

 

设置脏数据

脏数据是XCode实体类内置功能,每一个实体类属性set操作中都带有脏数据逻辑。

[NewLife.XCode]脏数据

实体类属性并非普通属性,而是带有OnPropertyChanging逻辑 

[NewLife.XCode]脏数据

这里是脏数据的默认设置点,先比较新旧值是否一致,如果一致,显然不会设置脏数据。

实体属性数值是否相等比较逻辑:

整数全部转换为Int64比较,避免因类型不同而误判

时间日期只比较年月日时分秒,而不比较毫秒等其它部分

字符串比较时,null与empty相等

浮点数比较(单精度和双精度),比较到小数点后6位

Decimal比较到小数点后12位

使用代码来表达,大概是下面的样子:

[NewLife.XCode]脏数据

实体类属性赋值有三种方法:

user.Password = "Stone"

user.SetItem("Password", "Stone")

user["Password"] = "Stone"

 主要功能相似,都是给Password字段赋值。

最大的不同点在于:后者一定不会设置脏数据,仅仅是简单赋值;前面两个可能会设置脏数据,要求Password原值不等于"Stone"时才会设置脏数据。

* SetItem就是第一种强类型脏数据和第三种弱类型赋值两者优点的混合体!

 

脏数据效果

[NewLife.XCode]脏数据

Update User Set Mobile='13012345678', Code='abcdef' Where ID=74

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdsfw.html