【数据事务】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列
- 【开篇】.NET开源 ORM 框架 SqlSugar 系列
- 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
- 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
- 【Db First】.NET开源 ORM 框架 SqlSugar 系列
- 【Code First】.NET开源 ORM 框架 SqlSugar 系列
- 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
- 【连接池】.NET开源 ORM 框架 SqlSugar 系列-CSDN博客
🔥数据库事务
数据库事务( transaction )是访问并可能操作各种 数据项 的一个数据库操作 序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
🟢事务特性
- 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
- 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。
- 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
- 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
1、单库事务
单库事务是针 一个db 操作执行的事务,无论是 ISqlSugarClient 和 SqlSugarClient 用法都一样
try{db.Ado.BeginTran();db.Insertable(new Order() { .....}).ExecuteCommand();db.Insertable(new Order() { .....}).ExecuteCommand();db.Ado.CommitTran();}catch (Exception ex){db.Ado.RollbackTran();throw ex;}
如果一个db就一个库,那么你也可以用多租户事务节约代码,因为2者在一个库的情况下作用一样。可以不写 .ado
db.BeginTran();//去掉了.adodb.CommitTran();//去掉了.adodb.RollbackTran();//去掉了.ado//ISqlSugarClient 接口使用多租户事务 看文档2.2
2、多库事务(可跨库)
多数据库事务是SqlSugar独有的功能,稳定比 CAP 更强(CAP还有一层队列),在单个程序中可以很愉快的使用多库事务。
SqlSugarClient 或者 SqlSugarSope 继承于2个接口 ,代码如下事务:
SqlSugarClient : ISqlSugarClient, ITenant
多租户声明
SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{new ConnectionConfig(){ ConfigId="0", DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection=true},new ConnectionConfig(){ ConfigId="1", DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection=true}
});
划重点:简单的说多租户事务和单库事务用法基本100%一致,唯一区别就是少了.Ado
2.1 SqlSugarClient 事务
因为继承 ITenant 了可以直接使用 (老版本var mysql=db.GetConnection要写在事务外面)
🚫注意:禁止使用 db.Ado.BeginTran ,多租户是 db.BeginTran
//禁止使用 db.Ado.BeginTran,多租户是db.BeginTrantry{db.BeginTran();db.GetConnection("1").Insertable(new Order() { }).ExecuteCommand();db.GetConnection("0").Insertable(new Order() { }).ExecuteCommand();db.CommitTran();}catch (Exception){db.RollbackTran();//数据回滚throw;}//主db
//注入的SqlSugarClient或者SqlSugarScope我们称为主db//子db
//通过租户方法GetConnection出来的我们称为子db,用来操作当前数据库,没有租户事务相关方法//主db可以用事务管理多个子db ,也可以使用 GetConnection等租户方法//目前底层是业务执行成功后统一提交事务,业务只要失败全部回滚,统一回滚过程中都有有3次重试回滚
//从目前用户使用情况来看,相当稳定几乎没有一例失败的反馈
//高安全级别数据:请使用差异日志+Catch(AggregateException ex)进行补偿机质
//如果回滚失败会throw new AggregateException
2.2 ISqlSugarClient 事务
因为和ITenant没有继承关系,需要用 . AsTenAnt() 转换一下 。
db.AsTenant().BeginTran();//低版本 (db as ITenant).BeginTran() db.AsTenant().CommitTran();db.AsTenant().RollbackTran();
3、调试事务
db.ContextId 要从事务开始,CURD 和事务结束 必须一致 这个事务才会生效,如果是MYSQL也检查一下表引擎是否支持事务。
❓不一致怎么办
-
SqlsugarClient 可以用变量 var db=外部Db; 所有操作使用db保证一致。
-
SqlsuagrScope (该对象是线程安全对象,可以单例)可以用单例模式保证一致。
测试代码 最好用 Insert ,因为 Update 有条件过滤等因素添会添加测试难度,我们用插入来进行测试会比较简单些
try{db.BeginTran();Console.WriteLine(db.Queryable<Order>().Count());//插入前数量db.Insertable(new Order() { CreateTime=DateTime.Now, Name="aa",Price=1}).ExecuteCommand();Console.WriteLine(db.Queryable<Order>().Count());//插入后数量throw new Exception("出错");db.CommitTran();}catch{db.RollbackTran();Console.WriteLine(db.Queryable<Order>().Count());//回滚后数量}
输出结果 为 155 156 155 插入前和回滚后一样就说明成功的。
4、语法糖
语法糖1: 5.0.4才支持
这种适合有 全局异常 的,直接出错扔出错并且回滚。
using (var tran = db.UseTran()){//业务代码//里面禁止写 try处理事务逻辑,格式一定按现在的风格来tran.CommitTran();}//要写 try处理异常可以写在外面
语法糖2:自动异常
这种适合 没有异常 处理的,减少了try 处理
var result = db.UseTran(() =>{var beginCount = db.Queryable<Order>().ToList();db.Ado.ExecuteCommand("delete Order");var endCount = db.Queryable<Order>().Count();return true;// 返回值等行result.Data});if (result.Data==false) //返回值为false{//result.Data 业务的返回值 //如果是上面的逻辑 result.Data==true肯定业务成功并且事务成功//if(result.IsSuccess==false)//事务执行了回滚//if(result.IsSuccess==true)//事务提交完成}
语法糖3:工作单元
UnitOfWork: 工作单元模式/IUnitOfWorK/DbContext - SqlSugar 5x - .NET果糖网
5、跨方法事务
SqlSugarScope 单例模式支持跨事务方法。
SqlSugarClient 需要 IOC 设置 Scoped 周期实现。
6、CAP事务 TCC 和 Saga
6.1 原理讲解
CAP可以支持跨程序间的事务处理(非跨程序事务不建议用,涉及到队列等,在单程序中稳定性肯定不如自带的多租户事务)
注意: MySql用户使用 升级到最新
1、数据库的自动释放要关闭
2、手动打开数据库连接 db.Ado.Connection.Open();
3、用db.Ado.Connection创建事务
4、把你的事务赋值到ORM对象 db.Ado.Transaction = 你的事务;
5、执行你的代码
6、关闭Connection对象
//用户使用案例
var db=GetSqlsugarclient();
//关闭自动释放(需要 using手动释放)
db.CurrentConnectionConfig.IsAutoCloseConnection = false;
//取出ADO事务
using (var connection = (MySqlConnection)db.Ado.Connection)//SqlServer是SqlConnection
{using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false)){if (connection.State != ConnectionState.Open){connection.Open();}db.Ado.Transaction = (IDbTransaction)transaction.DbTransaction;//这行很重要db.Insertable<Test>(new Test(){name = DateTime.Now.ToString()}).ExecuteCommand();_capBus.Publish("Sample.RabbitMQ.MySql", DateTime.Now);transaction.Commit();}
}
7、异步事务
📢 注意:请不要在同步方法里面写下面方代码,必须是异步方法才行 返回是要带有Task async 。
用法1:
try{await db.BeginTranAsync(); await db.Insertable(new Order(){CreateTime = DateTime.Now,CustomId = 1,Name = "aaa",Price = 0}).ExecuteCommandAsync();await db.CommitTranAsync();}catch (Exception){await db.RollbackTranAsync();}
用法2:
//只有5.0.3.8支持,老版本请升级使用var res = await db.UseTranAsync(async () =>{await db.Insertable(new Order(){CreateTime = DateTime.Now,CustomId = 1,Name = "aaa",Price = 0}).ExecuteCommandAsync();return true;//返回值会变成 res.Data});if (result.Data==false) //返回值为false{ //result.Data 业务的返回值//如果是上面的逻辑 result.Data==true肯定业务成功并且事务成功//if(result.IsSuccess==false)//事务执行了回滚//if(result.IsSuccess==true)//事务提交完成}//注意://await db.UseTranAsync 前面的await不要漏掉了
8、设置事务隔离级别
单库模式用法:
try
{db.Ado.BeginTran(IsolationLevel.ReadCommitted);//业务代码 db.Ado.CommitTran();
}
catch (Exception ex)
{db.RollbackTran();throw ex;
}
多租户模式:
var mysqlDb = db.GetConnection("mysql");var mssqlDb = db.GetConnection("mssql");try{mysqlDb.Ado.BeginTran(IsolationLevel.ReadCommitted);//开启库1的事务mssqlDb.Ado.BeginTran(IsolationLevel.ReadCommitted);//开启库2的事务//业务代码 只能用 mysqlDb和 mssqlDb db.CommitTran();//注意不能用db.ado.CommitTran}catch (Exception ex){db.RollbackTran();throw ex;
}
9、嵌套事务(支持异步)
9.1. 共享模式
有外部事务,内部事务用外部事务(推荐)
通过 工作单元 实现嵌套事务 5.1.2.5-preview03
//db.Ado.IsNoTran()表示事务为null才开启事务using (var uow = db.CreateContext(db.Ado.IsNoTran())) {using (var uow2 = db.CreateContext(db.Ado.IsNoTran())){ uow2.Commit();}uow.Commit(); //禁止用 db.RollBack 工作单元内只要throw会自动回滚}
9.2. 子事务独立 (不推荐)
🚫不推荐原因:这种很容易出现坑,比如业务A和业务B都用到了一样的表就会死锁
事务嵌套:推荐用9.1或者标题10 ,9.2是不推荐的
try{db.BeginTran();//业务..Avar childDb=db.CopyNew();try{childDb.BeginTran();//...业务BchildDb.Commit();}catch (Exception){childDb.RollbackTran();//数据回滚throw;}db.CommitTran();}catch (Exception){db.RollbackTran();//数据回滚throw;}
10、工作单元【事务特性】
在 .NET Core 中,可以使用自定义的 ActionFilter 来封装事务。
[ServiceFilter(typeof(TransactionFilter))]//加上这行就可以用了public IEnumerable<WeatherForecast> Get(){.....数据库操作... }
10.1 创建全局事务
public class TransactionFilter : IActionFilter{ISqlSugarClient _db;//你也可以换EF CORE对象 或者ADO对象都行public TransactionFilter(ISqlSugarClient db)//(ISqlSugarClient)需要IOC注入处理事务的对象{ _db=db;}public void OnActionExecuting(ActionExecutingContext context){_db.AsTenant().BeginTran();//接口要加.AsTenant()}public void OnActionExecuted(ActionExecutedContext context){if (context.Exception == null){_db.AsTenant().CommitTran();}else{_db.AsTenant().RollBack();}}}
10.2 IOC注册
//注入事务对象
builder.Services.AddScoped<TransactionFilter>();//注入ORM对象
//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar
services.AddSingleton<ISqlSugarClient>(s =>
{SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig(){DbType = SqlSugar.DbType.Sqlite,ConnectionString = "DataSource=sqlsugar-dev.db",IsAutoCloseConnection = true,},db =>{//单例参数配置,所有上下文生效db.Aop.OnLogExecuting = (sql, pars) =>{//获取作IOC作用域对象//var appServive = s.GetService<IHttpContextAccessor>();//var obj = appServive?.HttpContext?.RequestServices.GetService<Log>();//Console.WriteLine("AOP" + obj.GetHashCode());};});return sqlSugar;
});
10.3 在接口打上事务
[ServiceFilter(typeof(TransactionFilter))]//加上这行就可以用了[HttpGet(Name = "GetWeatherForecast")]public IEnumerable<WeatherForecast> Get(){.....数据库操作... }
11、MySql注意事项
(1)MYSQL不支持创建表和删除表处理事务,原生事务也一样 。
(2)MyISAM 存储引擎不支持事务 需要改成 InnoDB 。
相关文章:
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
深入解析下oracle char和varchar2底层存储方式
oracle数据库中,char和varchar2数据类型用来存储字符数据。char类型一旦定义多大,那么它就分配多少字节空间;varchar2类型定义多大,代表它可以扩展的最大大小为多大,一开始空间根据使用来决定。字符数据存储在oracle表…...
Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧
Angular在其最新版本 v19 中引入了增量水合(Incremental Hydration)这一特性。这一更新引发了开发者们广泛的讨论,特别是在优化首屏加载速度和改善用户体验方面。本文将详解水合过程的概念、增量水合的应用场景,以及它与类似框架如…...
宠物空气净化器推荐2024超详细测评 希喂VS霍尼韦尔谁能胜出
最近有粉丝一直在评论区和后台探讨宠物空气净化器是不是智商税的问题,有人认为宠物空气净化器肯定不是智商税,有些人认为将其购回家就是个没用的东西,还占地方,双方各有自己的观点。 其实宠物空气净化器和普通的空气净化器是有很大…...
一线、二线、三线技术支持
一线、二线、三线技术支持是企业IT支持体系中常见的分工模式,目的是高效解决技术问题,同时优化资源利用。以下是它们的具体定义和职责划分: 1. 一线技术支持 (Tier 1/Level 1 Support) 定义: 一线技术支持是直接面对最终用户或客…...
智截违规,稳保安全 | 聚铭视频专网违规外联治理系统新品正式发布
“千里之堤,毁于蚁穴”。 违规外联作为网络安全的一大隐患, 加强防护已刻不容缓。 这一次, 我们带着全新的解决方案来了 ——聚铭视频专网违规外联治理系统, 重磅登场!...
FFmpeg 的 codec 和 format
很多人容易混淆这二者区别 pcm_alaw, 这是 codec wav, 这是 format ffmpeg -formats 打印支持的所有 format ffmpeg -codecs 打印支持所有的 codec ffmpeg -i in.wav -y -ac 1 -ar 8000 -acodec pcm_alaw -f wav out.wav 把 in.wav 转换成 out.wav rtp/rtsp 等ÿ…...
分布式锁的实现原理
作者:来自 vivo 互联网服务器团队- Xu Yaoming 介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁,顾名思义,就是在分布式环境下使用的锁。众所周知,在并发编程中,我们经常需要借助并发控制工具,如 mu…...
怎样提高自己的能量
能量转换的基本原则是让别人需要你,而不是你去求对方。别人需要你,你的能量就高,你去求别人你的能量就低。 怎样提高自己的能量? 第一,留意你的气场和格局。气场不是说你表现的多么霸道,而是你的信念、决心…...
ospf协议(动态路由协议)
ospf基本概念 定义 OSPF 是典型的链路状态路由协议,是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 ( RFC2328 );针对 IPv6 协议使用 OSPF Version 3 ( RFC2740 )。…...
【娱乐项目】竖式算术器
Demo介绍 一个加减法随机数生成器,它能够生成随机的加减法题目,并且支持用户输入答案。系统会根据用户输入的答案判断是否正确,统计正确和错误的次数,并显示历史记录和错题记录。该工具适合用于数学练习,尤其适合练习基…...
Qt中模拟鼠标消息并与系统鼠标消息进行区分
功能使用场景: 开发一个教学系统,包含了教师端、学生端,并且教师端支持示教功能。此时,学生端的鼠标、键盘不响应系统事件,但需要响应教师端发过来的鼠标移动、按下消息。 因为共享页面相同,为了提高局域…...
实时数据开发 | 一文理解Flink窗口机制
窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎,认为批处理是流处理的一个特例。因此,通过窗口将流数据划分为有限大小的集合,使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数…...
MFC 自定义树控件:树节点的样式与交互
在本教程中,将介绍如何在 MFC 应用程序中使用树控件 (CTreeCtrl) 进行高级定制,包括设置字体、颜色、徽章、图标、节点的高度等。通过这些自定义设置,可以显著提升用户界面的交互性和视觉效果。 1. 树控件基本设置 首先,我们需要…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-loss.py
loss.py ultralytics\utils\loss.py 目录 loss.py 1.所需的库和模块 2.class VarifocalLoss(nn.Module): 3.class FocalLoss(nn.Module): 4.class DFLoss(nn.Module): 5.class BboxLoss(nn.Module): 6.class RotatedBboxLoss(BboxLoss): 7.class KeypointLoss(n…...
像素流送api ue多人访问需要什么显卡服务器
关于像素流送UE推流,在之前的文章里其实小芹和大家聊过很多,不过今天偶然搜索发现还是有很多小伙伴,在搜索像素流送相关的问题,搜索引擎给的提示有这些。当然这些都是比较短的词汇,可能每个人真正遇到的问题和想获取的…...
字符型注入‘)闭合
前言 进行sql注入的时候,不要忘记闭合,先闭合再去获取数据 步骤 判断是字符型注入 用order by获取不了显位,select也一样 是因为它是’)闭合,闭合之后,就可以获取数据了 最后就是一样的步骤...
评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分
子夜(603***854) 15:11:40 和各位讨论一下设计问题: 有个有业务场景: 有一组产品共4个产品(数目用户可自定义), 需要一套规则,比如如果用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分 又比如另一组产品 产品有个必选属性,如果选了其中所有的必选则5分, 其他项每1…...
Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南
Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南 引言 在当今信息爆炸的时代,如何从海量文本数据中快速准确地检索出相关信息,成为了一个迫切需要解决的问题。自然语言处理(NLP)技术的发展为这一挑战提供了新的解决方案。Elasticsearch,作为一个强大的搜索引…...
4. STM32_定时器
概述 什么是定时器: 定时器核心就是计数器,是使用精准的时基,通过硬件的方式,实现定时功能的器件。 定时器的工作原理: 主频时钟CLK通过PSC进行分频后产生定时器时钟TIM CLK,计数器CNT根据TIM CLK的频率…...
Mysql 深度分页问题及优化方案
Mysql 深度分页问题及优化方案 一、为什么 MySQL 深度分页慢?二、优化方案三、补充 一、为什么 MySQL 深度分页慢? 在数据量大时,深分页查询速度缓慢,主要原因是多次回表查询。 前言:N个条件为索引,id为主…...
前端性能优化技巧
前端性能优化技巧 1. 介绍 前端性能优化是确保网站或应用程序快速、响应迅速和流畅的关键。本文档将详细探讨提升前端性能的各种策略和最佳实践。 2. 资源加载优化 2.1 资源压缩 代码压缩:使用 Webpack、Terser 等工具压缩 JavaScript、CSS 文件文件大小压缩&a…...
taro使用createAsyncThunk报错ReferenceError: AbortController is not defined
解决办法: 1,安装这俩包:yet-another-abortcontroller-polyfill,event-target-polyfill 2,app.js import: import ‘event-target-polyfill’; import ‘yet-another-abortcontroller-polyfill’; 补充 但…...
Linux:systemd进程管理【1】
整体理解 要快速掌握Linux的systemd并覆盖80%的使用场景,以下是最重要的20%知识点: Systemd简介与核心功能: Systemd是一个系统和服务管理器,作为Linux系统的PID 1进程,负责启动和管理其他系统组件。它提供并行启动服…...
【Maven】继承和聚合
5. Maven的继承和聚合 5.1 什么是继承 Maven 的依赖传递机制可以一定程度上简化 POM 的配置,但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本,且这些模块之间不存在依赖关系,这就导致同一个依赖…...
【线上问题记录 | 排查网络连接问题】
问题描述 现在有我们程序是部署在服务器A的,A链接的是B。程序从B的redis进行存储和取数据的。 我们的业务是: 信息展示,也就是如果发现机器有异常了,实时进行监控。突然发现有一天,信息显示延迟了。 然后我们就开始排查究竟什么原…...
springboot车辆管理系统设计与实现(代码+数据库+LW)
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足,创建了一个计算机管理车辆管理系统的方案。文章介绍了车辆管理系统的系统分析部分&…...
独家|京东调整职级序列体系
原有的M、P、T、S主序列将正式合并为新的专业主序列P。 作者|文昌龙 编辑|杨舟 据「市象」独家获悉,京东已在近日在内部宣布对职级序列体系进行调整,将原有的M、P、T、S主序列正式合并为新的专业主序列P,合并后的职级体系将沿用原有专业序…...
Arrays.copyOfRange(),System.arraycopy() 数组复制,数组扩容
Arrays.copyOfRange() 当需要将数组中的 长度扩容时, 数组复制 使用 需要用到Arrays 类提供的的 参数解析 * param original the array from which a range is to be copied * param from the initial index of the range to be copied, inclusive * param to the final ind…...
Python学习37天
# 魔术方法 # 创建类Monster,默认为object的子类 class Monster: name None age None gender None def __init__(self, name, age, gender): self.name name self.age age self.gender gender # 重写魔术方法__str__输出实例对象信息…...
做善事的网站/在线营销推广
作者:飞狐来源:https://gitbook.cn/books/5c87e15be90d7734a3ac22b2/index.html1. 我们为什么需要限流为了“反脆弱”,在微服务复杂拓扑的情况下,限流是保障服务弹性和拓扑健壮的重中之重。想一想,如果业务推出了一个秒…...
高端html5网站建设织梦模板/seo监控系统
一个简单的OpenMP例子首先启动VisualStudio 2010,新建一个C的控制台应用程序,如下图所示:然后在项目解决方案资源管理器上选择项目名称,点击右键,选择“属性”,如下图所示:然后在属性页上左侧选…...
公司做网站怎么做账/制作链接的app的软件
SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等。可用SET命令改变这些系统变量,也可用SHOW命令列出它们.show 系统变量如:SQL> show linesizelinesize 1000使用set命令…...
wordpress 插件结构/无锡seo优化公司
Hadoop官网本来提供的都是32位,因为我们大部分都是64位,所以不得不编译。后来官网从Hadoop2.5版本开始就提供了64位。 cd /app/hadoop/lib/native/ [rootnode0 native]# file libhadoop.so.1.0.0 libhadoop.so.1.0.0: ELF 32-bit LSB shared object, Int…...
营销型网站建设 合肥/新人做外贸怎么找国外客户
Java 对象和类Java作为一种面向对象语言。支持以下基本概念:多态继承封装抽象类对象实例方法消息解析本节我们重点研究对象和类的概念。对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有&…...
网站做流量/宁波seo网络推广优质团队
import numpy as npa np.array([[2, 2], [np.nan, 1]]) print(np.all(np.isnan(a))) # False print(np.nansum(a)) # 5.0 print(np.nanmean(a)) # 1.67...