ET介绍——为什么使用C# .net core做服务端?

为什么使用C# .net core做服务端?

游戏服务端从早期的单服到分布式,开发越来越复杂,对稳定性,开发效率要求越来越高。开发语言的选择也逐步发生了变化,C 到 C++ 到 C++ + PYTHON 或者C++ + LUA 到现在 很多公司开始使用erlang,go,java,c#。目前是一个百花齐放的局面。

但是如果是要你重新做一个网游server,不考虑对公司或者已有的东西兼容性,你会怎么选择?我仔细想了一下这个问题,大概有这个几个方面需要考虑:

1. 语言的稳定性(致命性)

游戏服务器的特点是高负载低延时。所以一般服务端进程都是带状态的,一旦挂掉就意味着数据丢失,这点是无法容忍的。

2. 运行时热更(致命性)

游戏服务器逻辑极其复杂,很容易出现bug,但是又不能经常停服,所以热更修复bug就显得十分必要。出现错误开发人员可以立即编写代码,然后热更修复,线上用户完全感觉不到。

3. 是否有协程支持(重要性5星)

分布式服务器架构,进程与进程之间必然会有大量交互。由于游戏逻辑很难拆分成多线程,所以一般来说都是逻辑单线程。如果没有协程支持,必然产生大量回调,代码维护会变得非常困难。

4. 编译速度(重要性5星)

使用c++开发,30%的时间都浪费在编译上。假如编译很快或者不需要编译,必定大大提高开发效率。

5. 跨平台(4星)

一般游戏服务器都架设在linux上面。但是平常开发,使用windows会更加方便,如果跨平台,开发以及测试效率会大大提升,并且不需要单独搞一个开发机,本机电脑就可以满足平常开发

6. 可阅读性,可重构性(3星)

代码可以重构能大大减轻写代码的难度

7. 库是否齐全,生态是否完善(3星)

库齐全,生态好,自己需要造的轮子就少

8.跟客户端统一语言(3星)

客户端服务端共用语言,优势十分明显,很多代码可以复用,逻辑程序员不再需要区分前后端,双端都可以写,一个人即可完成一个功能,大大减少了沟通的时间成本。

9. IDE的支持(3星)

代码提示,重构等支持,优秀的IDE能提高几倍的开发效率。

10. 语言的性能(1星)

目前服务器性能都不是太大问题,不过性能好总比性能差要强。

语言C#C/C++JavaGoLuaPythonErlang
稳定性 稳定 容易挂 稳定 稳定 稳定 稳定 稳定
运行时热更 支持 较难支持 支持 不支持 支持 支持 支持
跨平台 支持 较难支持 支持 支持 较难支持 支持 支持
协程 需要自己实现 支持不好 支持 支持 支持 支持
编译速度 不需要编译 不需要编译
阅读性重构性 一般 一般
游戏库跟生态 一般 一般 一般
客户端统一语言 Unity Unity、UE4 暂无 暂无 Unity、UE4 UE4 暂无
IDE的支持 普通
语言的性能 极好 很差

从表格可以看出:

  1. C/C++稳定性差,编译速度慢,存在致命缺陷
  2. Go不支持热更,由于不支持泛型,重构性较差,无法跟客户端共享代码,存在致命缺陷
  3. Java协程支持差,无法跟客户端共享代码
  4. Lua库少,性能差,代码可阅读性可重构性差,跨平台完全依赖C/C++,处理起来麻烦,ide支持差
  5. Python 性能很差,代码可阅读性可重构性差,无法跟客户端共享代码,ide支持差
  6. Erlang 性能差,函数式风格不好上手,ide支持差
  7. C# .net core各个方便都非常优秀,不过跟UE4无法共享代码

当前Unity是最火的游戏引擎,C#服务端搭配Unity完全是天作之合,基本上找不到缺陷。

ET开源地址地址:egametang/ET: Unity3D Client And C# Server Framework (github.com)   qq群:474643097

本文转载于网络 如有侵权请联系删除

相关文章

  • 抖音、饿了么协同作战?

    配图来自Canva可画本地生活圈又有大事发生了。日前,饿了么和抖音共同宣布达成合作。双方表示,将携手探索本地生活服务的新场景升级,在视频化时代带来“即看、即点、即达”的本地生活新体验。此消息一出,各方目光再度聚焦至本地生活领域。事实上,瞄准本地生活这块蛋糕的玩家并不在少数,且不提早已在本地生活领域打下一片江山的老玩家美团,即便是近两年入局本地生活领域的新玩家们,也都各有凭仗。值得一提的是,无论是抖音还是饿了么,都是各自领域的佼佼者,而此次双方联手、并肩作战,或将在本地生活这片海域掀起新波澜。巨头“围猎”本地生活近两年,各领域的头部玩家就像商量好了似的,扎堆布局本地生活领域。除了以抖音、快手为代表的短视频平台动作频频之外,百度、京东等互联网巨头也不甘示弱,纷纷进军本地生活领域。那么,本地生活服务领域究竟有何魅力,能引得互联网大厂竞相追逐?首先,互联网巨头深陷流量焦虑,亟需寻到新增长点。对互联网企业来说,流量的重要性不言而喻,不过随着互联网流量红利逐渐见顶,越来越多的互联网巨头开始遭遇流量困境。为了缓解流量焦虑,互联网巨头往往通过探索边界等方式拓宽流量来源,进而实现用户和业务的双增长。因此

  • 曹工改bug:cpu狂飙,old gc频繁,线程神秘死亡连环案件调查报告

    曹工改bug:cpu狂飙,oldgc频繁,线程神秘死亡连环案件调查报告前言前两天,访问开发环境上一个java服务,发现一直转圈圈,因为我开着fiddler,可以看到的现象是,接口一直没返回;本来想着直接jenkins重新构建一下开发环境(即重启服务),突然觉得,还是看看到底啥情况吧。#排查过程登录到开发环境上(8核16g,centos7),来了一圈常规操作,结果执行top发现,cpu占用竟然高达400%,然后按照标准流程,那肯定就是查看该进程内占用cpu高的线程是哪个:top-H-ppid 复制因为当时没截图,只保存了文本:线程idcpu占用率 19093root20065998521.107g14612S19.37.130:17.26java 19087root20065998521.107g14612S15.37.122:28.15java 19089root20065998521.107g14612S15.37.122:28.99java 19091root20065998521.107g14612S15.37.122:27.07java 19092root20065998521

  • 数据安全法下,企业如何平衡数据安全合规与业务性能?| 产业安全专家谈

    ​6月,历经三审,我国第一部有关数据安全的专门法律《数据安全法》通过,并将于9月1日起施行。作为国家基础性和战略性资源,数据安全被正式提升到国家安全层面。《数据安全法》从监管体系、数据安全与发展、数据安全制度、数据安全保护义务、政务数据安全与开放、法律责任等方面,对企业数据处理活动进行规制。未来,企业在数据方面的纠纷将有法可依,同时合法合规也将成为企业运营数据业务的新门槛。面对《数据安全法》提出的新要求,本期产业安全专家谈,我们邀请到腾讯安全云鼎实验室高级研究员谢灿,就数据安全法下,企业如何平衡合规要求与业务性能进行解答,并分享腾讯安全保障数据安全的落地应用。Q1:《数据安全法》对于企业在数据安全防护上提出了哪些要求?谢灿:我们简单以数据安全法的定义来讲,它是指采取必要的措施确保数据处于有效防护和合法利用的状态,并且具备持续保障安全状态的能力。这里面我们解读三个关键点,第一个是合法合规,这里具体包括我们的数据采集、数据应用、数据出境、数据安全管理的方面的合法性和合规性;第二个是持续安全状态,包括我们的静态的数据流动和运营中的数据的安全;第三个是我们在数据安全防护之外还应该具备数据的风险

  • 【设计数据结构】面试官:用队列实现栈 ...

    题目描述这是LeetCode上的「225.用队列实现栈」,难度为Easy。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop和empty)。实现MyStack类:voidpush(intx)将元素x压入栈顶。intpop()移除并返回栈顶元素。inttop()返回栈顶元素。booleanempty()如果栈是空的,返回true;否则,返回false。注意:你只能使用队列的基本操作——也就是pushtoback、peek/popfromfront、size和isempty这些操作。示例:输入: ["MyStack","push","push","top","pop","empty"] [[],[1],[2],[],[],[]] 输出: [null,null,null,2,2,false] 解释: MyStackmyStack=newMyStack(); myStack.push(1); myStack.push(

  • Apache NIFI项目结构的类资源隔离机制

    前言本文简单的讨论一下ApacheNIFI项目结构的类资源隔离机制,适合接触过源码的同学阅读。NIFI的常见的子Moudle结构以nifi-flume-bundle为例nifi-flume-bundle --nifi-flume-processors --nifi-flume-nar 复制nifi-flume-bundle有两个子项目,nifi-flume-processors里是Processor的具体实现,打成jar包。nifi-flume-nar里没有代码实现负责将nifi-flume-processors.jar及其依赖打成nar包。NAR是什么?NAR是NiFiArchive的缩写,创建nar的原因是为了实现Java类加载器隔离资源。NIFI的组件实现都来自不同的公司和贡献者,代码里往往会引入不同版本的第三方库(比如apache-commons等)。NAR文件避免了NoClassDefFoundError异常的出现(这些异常是由于在不同处理器的类加载器中已经加载了错误版本的依赖而引发的)。NAR文件结构META-INF bundled-dependencies async-1

  • SpringBoot使用@ConstructorBinding注解进行配置属性绑定

    SpringBoot2.2版本发行后一些新的功能也渐渐的浮出了水面,在之前版本SpringBoot的配置文件与类之间的属性绑定(@ConfigurationProperties)是通过Setter方法来进行绑定对应的配置值,而从2.2版本开始支持了构造函数的方式进行绑定。免费教程专题恒宇少年在博客整理三套免费学习教程专题,由于文章偏多特意添加了阅读指南,新文章以及之前的文章都会在专题内陆续填充,希望可以帮助大家解惑更多知识点。SpringBoot基础教程专题SpringCloud基础教程专题ApiBoot基础教程专题博客原文:http://blog.yuqiyu.com/springboot-constructor-binding-properties.html@ConstructorBinding注解这个注解是SpringBoot在2.2发行版中添加的,添加该注解的属性配置类不再需要添加Setter方法,不过需要添加构造函数,根据构造函数进行实例化属性配置类。创建项目使用IDEA创建一个SpringBoot项目,在pom.xml中添加依赖如下所示:<dependencies&g

  • 用Python随手画个图

    最近遇到个任务需要画一些坐标图,我就在想,用了这么长时间的Python了,能不能用Python画图呢?学习一门语言不能只为了学习语言而学习,要做到学以致用。Google了一下,果然有新的发现,Python中matplotlib库是专门用来画图的,操作了一番后,发现用Python画图真的爽,人生苦短,快用Python!下面简单的介绍一下matplotlib库的用法,起到一个抛转引玉的作用,更多好玩的事情等待着咱们一起来探索。我有如下数据集,想要在坐标轴上画出它们的图像:x=[-1.0,-0.5,1.5,2.5,4.0,5.5,7.0,9.0,10.5,11.5, 13.0,15.5,18.0,20.5,23.0,25.5,28.0,33.0,38.0,43.0] data1=[0.1,0.9,5.6,7.8,14.8,21.2,26.3,32.0,36.6,39.4, 42.6,47.9,52.2,56.1,59.8,63.2,66.3,72.2,77.5,81.5] data2=[0.1,0.2,2.1,3.7,6.8,9.8,11.8,14.9,16.1,17.2, 18.6,20.

  • 原生jdbc示例 与spring JDBC 示例

    版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_37933685/article/details/81676680个人博客:https://suveng.github.io/blog/​​​​​​​原生jdbc与spring整合JDBC介绍JDBCAPI允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。执行流程:连接数据源,如:数据库。为数据库传递查询和更新指令。处理数据库响应并返回的结果。首先需要把jar包导进来,mysql-connector-java-6.0.6.jar,如果用maven把一下依赖添加进pom.xml<!--mysqlconnnector--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version

  • 如何应用HTTPDNS及全站HTTPS协议避免域名被劫持?

    域名对于公司重要吗?毋庸置疑的当然是很重要,域名就相当于一个门牌号,如果您去拜访别人,不知道门牌,是不是很耽误事呢?那么域名被劫持的可能性有哪几种呢? 1.运营商劫持,运营商在基础网络层面的对域名的劫持,主要是一个单方的县级或者市级,不会是针对所有地区。运营商为了减少跨ISP的流量结算,会在本网内缓存ICP的内容,广告联盟等甚至也会劫持域名替换广告,劫持域名解析是安全上的一大隐患,意味着可以任意操纵缓存,随意挂马。 2.DNS劫持,DNS服务器层面对于域名的劫持; 3.服务器劫持,黑客根据服务器的漏洞等原因入侵后,对数据文件进行篡改等; 4.本地劫持,有可能会因为电脑中病毒了,把域名做了跳转,当您打开看到的可能就是涉黄等网站,或者钓鱼的非法网站,或者会强行插入游戏等。 那么HTTPDNS的本质是利用HTTP协议来完成域名解析,防止被运营商劫持,通常使用HTTPDNS的客户端域名解析会使用互联网公司的服务器,绕过运营商的本地DNS,但是这一微小的转换,却带来了无数的收益。比如用户在客户端的域名解析请求将不会遭受到域名解析异常的困扰、能直接获取到用户IP,让用户可以访问最快的IDC节点、提

  • Android-多线程

    一:线程相关概念聊多线程之前,我们先说一说线程,说线程之前,我们了解一下进程。1.什么是进程?    通俗的说:我们平日里打开的QQ,微信,简书,都是一个进程。进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。任务管理器就是管理和结束进程的,上图:任务管理器管理的都是进程。2.那么什么是线程呢?    进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是在进程的基础之上进行进一步的划分。那么跟进程一样,线程也有生命周期,我们等会详细说。一个程序只可以有一个进程,但这个进程可以包含多个线程。3.什么是多线程?   多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。4..并发和并行?刚才说线程的时候我们提到了并发,我们现在来简单介绍一下:    并发:并发是指一个处理器同时处理多个任务   并行:并行是指多个处理器或者是多核的处理器同时处理多个不同的任务打比方:并发是一个人同时吃

  • Gradle从入门到了解 - 简书

    作者:hongjay地址:http://www.jianshu.com/p/88fb3876d92d声明:本文是hongjay原创,已获其授权发布,未经原作者允许请勿转载通过这篇文章,你可以了解到以下内容:1、在自己的项目中使用脚本准备起飞。一次打包十几个项目不嫌累。2、面对下载下来的开源项目编译报错有一定处理能力。3、水群吹牛逼直起腰板。 Gradle概述Gradle(英[g'reɪdl])是一个任务驱动型的构建工具,是一个依赖管理工具,更是一个编程框架。 它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。 在androidstudio中,我们使用这个工具可以完成app的编译打包等工作。GoalsofthenewBuildSystem(使用gradle的目的)1、Makeiteasytoreusecodeandresources2、Makeiteasytocreateseveralvariantsofanapplication,eitherformulti-3、apkdistributionorfordifferentflavo

  • 腾讯云物联网通信创建设备物联网通信API20180614

    1.接口描述接口请求域名:iotcloud.tencentcloudapi.com。 本接口(CreateDevice)用于新建一个物联网通信设备。 默认接口请求频率限制:100次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:CreateDevice。 Version 是 String 公共参数,本接口取值:2018-06-14。 Region 否 String 公共参数,本接口不需要传递此参数。 ProductId 是 String 产品ID。创建产品时腾讯云为用户分配全局唯一的ID DeviceName 是 String 设备名称。命名规则:[a-zA-Z0-9:_-]{1,48}。 Attribute 否 Attribute 设备属性 D

  • Ledge 知识和工具平台

    源码地址:https://gitee.com/phodal/ledge(如有侵权请及时联系博主删贴) https://devops.phodal.com/pattern   #Ledge知识和工具平台 在线使用:https://devops.phodal.com/ Gitee(MVP):https://gitee.com/phodal/ledge 国内服务器: CODING(每小时同步):https://ledge.devops.host/ 腾讯云-云开发服务器(不定期同步):https://ledge.wdsm.io/ Ledge(fromKnow-Ledge,意指承载物)知识和工具平台,是我们基于在ThoughtWorks进行的一系列DevOps实践、敏捷实践、软件开发与测试、精益实践提炼出来的知识体系。它包含了各种最佳实践、原则与模式、实施手册、度量、工具,用于帮助您的企业在数字化时代更好地前进,还有DevOps转型。 您可以在这个平台上看到: 工具元素周期表。帮助您进行数字化时代的DevOps工具选型。 DevOps设计工具。帮助您设计组织内

  • Spring Boot + Spring Cloud 构建微服务系统(三):服务消费和负载(Feign)

    SpringCloudFeign SpringCloudFeign是一套基于NetflixFeign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。SpringCloudFeign还扩展了对SpringMVC注解的支持,同时还整合了Ribbon来提供均衡负载的HTTP客户端实现。 添加依赖 修改 spring-cloud-consul-consumer的pom文件,添加feign依赖。 pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>复制 修改启动器 修改启动器类,添加 @EnableFeig

  • 使用margin负值实现压住相邻边距

    1<divstyle="width:1200px;height:900px;margin:0auto;border:1pxsolid#22DD22;"> 2<divclass="margin"></div> 3<divclass="margin"></div> 4<divclass="margin"></div> 5<divclass="margin"></div> 6<divclass="margin"></div> 7<divclass="margin"></div> 8<divclass="margin"></div> 9<divclass="margin"></div> 10</div>复制 1.margin{ 2position:relative;//使用定位是为了使用z-index,提高层级 3width:200px; 4height:400px; 5bor

  • React Native 环境搭建问题汇总

    问题1: Aproblemoccurredconfiguringrootproject'sxtbdemo2'. Couldnotresolveallfilesforconfiguration':classpath'. Couldnotfindcom.android.tools.build:gradle:3.0.1. Searchedinthefollowinglocations: https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.pom https://jcenter.bintray.com/com/android/tools/build/gradle/3.0.1/gradle-3.0.1.jar Requiredby: project: Try: Runwith--stacktraceoptiontogetthestacktrace.Runwith--infoor--debugoptiontogetmorelogoutput. Getmorehelpathttps://hel

  • LOJ2319. 「NOIP2017」列队【线段树】

    LINK 思路 神仙线段树 你考虑怎么样才能快速维护出答案 首先看看一条链怎么做? 首先很显然的思路是维护每个节点的是否出过队 然后对于重新入队的点 直接在后面暴力vector存一下就可以了 最核心的思路就是假设你已经知道了当前位置的点是什么编号,最后通过计算/查询来得出答案 然后不是链的情况其实就动态开点就可以了 因为有用的状态很少 然后就直接进行查询就可以了 //Author:dream_maker #include<bits/stdc++.h> usingnamespacestd; //---------------------------------------------- //typename typedeflonglongll; //convenientfor #definefu(a,b,c)for(inta=b;a<=c;++a) #definefd(a,b,c)for(inta=b;a>=c;--a) #definefv(a,b)for(inta=0;a<(signed)b.size();++a) //infofdifferenttyp

  • ECMAScript与JavaScript

      JavaScript是一种专门与网页交互而设计的脚本语言。ECMAScript就是JavaScript吗?并不是,JavaScript的含义要比ECMAScript要多很多。JavaScript由三个部分组成:ECMAscript(核心)、DOM(文档对象模型)、BOM(浏览器对象模型)。   ECMAScript只是定义这门语言的基础,规定了JavaScript的语法、类型、语句、关键字、保留字、操作符和对象。   文档对象模型(DOM,DocumentObjectModel)是用于HTML的应用程序编程接口(API) ,通过DOM创建的一个表示文档的树形图,开发人员获得了控制页面内容和结构的主动权。借助DOM提供的API,开发人员可以轻松自如地删除、添加、替换或修改任何节点。   浏览器对象模型(BOM,BrowserObjectModel)是处理浏览器窗口和框架;但人们习惯上也把所有针对浏览器的JavaScript扩展算作BOM的一部分,包括以下扩展      弹出新浏览器窗口的功能;     移动、缩放和关闭浏览器窗口的功能;    

  • 软工实践个人总结

    ##一、请回望第一次作业,你对于软件工程课程的想象 ##1)对比开篇博客你对课程目标和期待,“希望通过实践锻炼,增强计算机专业的能力和就业竞争力”,对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么? 开篇所提,学习软工实践是想要提升自己的完整项目开发能力,了解软件开发的流程,这门课的难度达到了期待,但是实际课上学到的内容却比较匮乏(都怪我课上好好听),实践过程中没有好的指导,依旧是团队依靠团队自己 ##2)总结这门课程的实践总结和给你带来的提升,包括以下内容: 统计一下,你在这门软件工程实践中,完成了多少行的代码 大约3K 软工实践的各次作业分别花了多少时间?(做一个列表) 作业 耗时(h) 第一次博客作业 3 第一次个人编程作业 6 第一次结对编程作业 15 团队展示 3 第二次结对编程作业 20 团队项目-需求分析报告 3 团队Git现场编程实战 10 Alpha冲刺 50 Alpha事后诸葛亮 2 Beta冲刺 30 Beta版本演示 5 哪一次作业让你印象最深刻?为什么?

  • 理解C#泛型运作原理

    前言  我们都知道泛型在C#的重要性,泛型是OOP语言中三大特征的多态的最重要的体现,几乎泛型撑起了整个.NET框架,在讲泛型之前,我们可以抛出一个问题,我们现在需要一个可扩容的数组类,且满足所有类型,不管是值类型还是引用类型,那么在没有用泛型方法实现,如何实现? 一.泛型之前的故事  我们肯定会想到用object来作为类型参数,因为在C#中,所有类型都是基于Object类型的。因此Object是所有类型的最基类,那么我们的可扩容数组类如下: publicclassArrayExpandable { privateobject?[]_items=null; privateint_defaultCapacity=4; privateint_size; publicobject?this[intindex] { get { if(index<0||index>=_size) thrownewArgumentOutOfRangeException(nameof(index)); return_items[index]; } set { if(index<0||inde

  • 脏读,不可重复读,幻读区别和避免

    在了解脏读,不可重复度,幻读之前,首先要明白这三种情况的出现都是和数据库并发事务有关联的,如果所有的读写都按照队列的形式进行,就不会出现问题。 名词解析和解决方案 脏读 脏读又称无效数据读出(读出了脏数据)。一个事务读取另外一个事务还没有提交的数据叫脏读。 例如:事务T1修改了某个表中的一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因回滚(Rollback)了,那么事务T2读取的数据就是脏的(无效的)。 解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读) 不可重复读 不可重复读是指在同一个事务内,两次相同的查询返回了不同的结果。 例如:事务T1会读取两次数据,在第一次读取某一条数据后,事务T2修改了该数据并提交了事务,T1此时再次读取该数据,两次读取便得到了不同的结果。 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ(可重复读) 幻读 幻读也是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。 例如:系统事务A将数据库中所有数据都删除的时候,但是

相关推荐

推荐阅读