核定征收企业所得税计算方法案例_核定征收企业所得税计算方法|视点
1、核定征收有两种情况,一种是核定应税所得率,这种的计算方法是(收入全额—不征税收入-免税收入)×应税所得率×25%,应
二阶段消息是DTM
新提出的,可以完美代替现有的事务消息和本地消息表架构。无论从复杂度、性能、便利性还是代码量都是完胜现有的方案。
(资料图片仅供参考)
相比现有的消息架构借助于各种消息中间件比如RocketMQ
等,DTM
自己实现了无需额外的学习成本。它能够保证本地事务的提交和全局事务提交是“原子的”,适合解决不需要回滚的分布式事务场景。
二阶段消息保证提交的原子性和如何保证业务成功执行如下时序图:
二阶段消息主要是指Prepare
和Submit
两个阶段,主程序向DTM
服务发送Prepare
消息,成功后执行本地事务,完成本地事务后发送Submit
消息至DTM
服务,之后DTM
会调用分支事件执行其他服务,最后完成全局事务。
当发送了Prepare
但是Submit
没有提交的话,会进行回调请求来确认消息的情况,具体工作过程如下:
1、在处理本地事务时,会将gid
插入到barrier
表中,同时带上插入原因为committed
。该表有一个唯一索引,主要字段为gid
。
2、当进行回查时,二阶段消息的操作不是直接查gid
是否存在,而是再insert ignore
一条带有相同gid
的数据,同时带上插入原因为rollbacked
。此时如果表中如果已有gid
的记录,那么新的插入操作就会被ignore
,否则数据会被插入。
3、然后再用gid
查询表中的记录,如果查到记录的reason
为committed
,那么说明本地事务已提交;如果查到记录的reason
为rollbacked
,那么说明本地事务已回滚。
我使用二进制包下载安装地址,我是Window
环境所以下载后解压,点击dtm.exe
进行运行即可,如下启动成功
启动成功后可以访问http://localhost:36789
,进入管理后台
我们需要创建一个表处理消息的回查,表里保存全局事务ID,具体作用在后续说明,我这里用的SqlServer数据库,所以执行如下:
CREATE TABLE [dbo].[barrier]( [id] bigint NOT NULL IDENTITY(1,1) PRIMARY KEY, [trans_type] varchar(45) NOT NULL DEFAULT(""), [gid] varchar(128) NOT NULL DEFAULT(""), [branch_id] varchar(128) NOT NULL DEFAULT(""), [op] varchar(45) NOT NULL DEFAULT(""), [barrier_id] varchar(45) NOT NULL DEFAULT(""), [reason] varchar(45) NOT NULL DEFAULT(""), [create_time] datetime NOT NULL DEFAULT(getdate()) , [update_time] datetime NOT NULL DEFAULT(getdate()))GOCREATE UNIQUE INDEX[ix_uniq_barrier] ON[dbo].[barrier] ([gid] ASC, [branch_id] ASC, [op] ASC, [barrier_id] ASC)WITH(IGNORE_DUP_KEY = ON)GO
这里比较关键的是那个唯一索引,有一个IGNORE_DUP_KEY = ON
,这个其实就是为了等价mysql
的insert ignore
表示存在相关字段的信息则不插入,否则就插入数据
当然还支持很多其他的数据库,建表语句可以从这里查看地址
四、创建项目我们简单的创建两个.net core webapi
项目进行测试,两个项目都进行相同的如下操作:
1、安装Dtmcli和Microsoft.EntityFrameworkCore.SqlServer
安装Dtmcli
是因为其中已经帮我们集成了DTM
客户端SDK HTTP
版本,想要GRPC
版本可以安装Dtmgrpc
。
安装Microsoft.EntityFrameworkCore.SqlServer
很显然是为了处理数据库。
Install-Package DtmcliInstall-Package Microsoft.EntityFrameworkCore.SqlServer
2、配置
接下来我们配置服务,先在配置文件appsetting.json
中添加如下
"AppSettings": { "DtmUrl": "http://localhost:36789", "BusiUrl": "http://localhost:5056", "QueryPreparedUrl": "http://localhost:5046", "BarrierConn": "Data Source=.;Initial Catalog=HTGL;TrustServerCertificate=True;;Integrated Security=True" }
DtmUrl
:DTM
的监听地址,http
的是36789
,grpc
的是36790
BusiUrl
:访问其他服务的地址
QueryPreparedUrl
:回查的地址
BarrierConn
:数据库连接语句
添加一个配置类:
public class AppSettings { public string DtmUrl { get; set; } public string BusiUrl { get; set; } public string BarrierConn { get; set; } public string QueryPreparedUrl { get; set; } }
之后注入服务如下:
builder.Services.AddDtmcli(dtm => { dtm.DtmUrl = builder.Configuration.GetValue("AppSettings:DtmUrl"); dtm.SqlDbType = DtmCommon.Constant.Barrier.DBTYPE_SQLSERVER; dtm.BarrierSqlTableName = "[HTGL].[dbo].[barrier]";});builder.Services.Configure (builder.Configuration.GetSection("AppSettings"));
SqlDbType
:表示使用的数据库类型
BarrierSqlTableName
:Barrier
表的名字
3、添加代码
我们在其中一个项目添加主程序代码如下:
[ApiController]public class DtmController : ControllerBase { private readonly ILogger_logger; private readonly IDtmClient _dtmClient; private readonly IDtmTransFactory _transFactory; private readonly AppSettings _settings; private readonly IBranchBarrierFactory _factory; public DtmController(ILogger logger, IDtmClient dtmClient,IDtmTransFactory transFactory, IOptions settings, IBranchBarrierFactory factory) { _logger = logger; _dtmClient = dtmClient; _transFactory = transFactory; _settings = settings.Value; _factory = factory; } private DbConnection GetConn() => new Microsoft.Data.SqlClient.SqlConnection(_settings.BarrierConn); [HttpPost("post-dtm-msg")] public async Task Get(CancellationToken cancellationToken) { //1、创建gid var gid = await _dtmClient.GenGid(cancellationToken); //2、设置分支事务 var msg = _transFactory.NewMsg(gid) .Add(_settings.BusiUrl + "/TransOut", new { id = 123 }) .Add(_settings.BusiUrl + "/TransIn", new { id = 321 });//3、执行submit using (DbConnection conn = GetConn()) { await msg.DoAndSubmitDB(_settings.QueryPreparedUrl + "/msg-queryprepared", conn, async tx => { //4、执行本地事务 await Task.CompletedTask; }); } _logger.LogInformation("result gid is {0}", gid); return Content("SUCCESS"); } [HttpGet("msg-queryprepared")] public async Task QueryPrepared(CancellationToken cancellationToken) { var bb = _factory.CreateBranchBarrier(Request.Query); _logger.LogInformation("bb {0}", bb); using (DbConnection conn = GetConn()) { //回调查询消息状态 var res = await bb.QueryPrepared(conn); return Ok(new { dtm_result = res }); } } }
然后我们向另一个服务项目添加如下代码,作为一个简单的服务方法,没有任何操作只是返回成功:
[ApiController] public class TransController : ControllerBase { private readonly ILogger五、执行查看结果_logger; private readonly IBranchBarrierFactory _factory; private readonly AppSettings _settings; private DbConnection GetConn() => new Microsoft.Data.SqlClient.SqlConnection(_settings.BarrierConn); public TransController(ILogger logger, IBranchBarrierFactory factory, IOptions settings) { _logger = logger; _factory = factory; _settings = settings.Value; } [HttpPost("TransIn")] public async Task In() { return Results.Ok(new { dtm_result = "SUCCESS" }); //return Results.Ok(new { dtm_result = "FAILURE" }); } [HttpPost("TransOut")] public async Task Out() { return Results.Ok(new { dtm_result = "SUCCESS" }); } }
我们正常执行,可以看到下面的动图结果,在执行完本地事务后会访问分支事务,然后数据库表中添加了一条记录
可以在管理后台看到我们请求成功的信息
如果要演示失败,需要做以下修改直接报错,我们可以看到访问了回调方法,然后数据库中看到rollback
标记的消息
using (DbConnection conn = GetConn()) { await msg.DoAndSubmitDB(_settings.QueryPreparedUrl + "/msg-queryprepared", conn, async tx => { throw new Exception("报错了"); //4、执行本地事务 await Task.CompletedTask; }); }
提交后再宕机演示比较麻烦,我就不演示了,大家意会即可。
如果分支事务返回的不是SUCCESS而是FAILURE会由DTM隔一段时间重新请求,dtm对每个事务的重试是指数退避策略,具体为间隔是每失败一次,间隔加倍,避免过多的重试,导致系统负载异常上升。
如果您经过长时间的的宕机,因指数退避算法导致要很久才会重试。如果您想要手动触发立即重试,您可以手动把相应事务的next_cron_time(Redis存储引擎的该功能还在开发中)修改为当前时间,就会在数秒内被定时轮询,事务就会继续往前执行。
关键词:
1、核定征收有两种情况,一种是核定应税所得率,这种的计算方法是(收入全额—不征税收入-免税收入)×应税所得率×25%,应
资料图。图为兴安盟大片稻田。 兴安日报供图中新网兴安盟3月31日电(张玮张昕阳)31日,记者从内蒙古自治区兴安盟行署
梅根自称是独生女,同父异母的姐姐告她胡说并索赔7 5万美元,被法官驳回---在接受美国脱口秀女王奥普拉采访时,哈里王子的妻子梅根称自己是独
三一重工(SH600031,收盘价:17 09元)3月31日晚间发布公告称,2023年3月30日,公司召开第八届董事会第十一次会议审议通过了《关于公司以集中竞
活动现场。王洪涛摄“市委市政府这几年通过招募乡村振兴合伙人,有力促进了乡村振兴,我们村借此机会既发展了产业项目,又增加了村级集体收入
血源诅咒是一款好玩的魂类动作游戏,深受玩家们的喜爱,很多玩家想知道血源诅咒愚蠢的蜘蛛罗姆在哪里,为了帮助玩家更快的找到,今天小编就为
3月28日,中国金融品牌年会暨第五届中国金融年度品牌案例大赛颁奖典礼在北京举办,携程金融凭借直播系统化运营传播案例的出色表现,获得“品牌
吉比特2022年营收增12%净利降0 52%股价涨停
3月30日,龙岩经济技术开发区税务局举办第32个全国税收宣传月暨“税惠春风助企行”活动启动仪式。此次活动分启动仪式和“税
商铺认筹送的礼品,我知道,阿姨快过生日啦,老早上给我打电话,说明在阿姨家里给我送什么生日礼物,阿姨平时对我也挺好的。不过
本周M10硅片主流成交价格为6 48元 片,G12主流成交价格为8 2元 片。M10电池片主流成交价为1 08元 W,G12电池片主流成交价有所上涨,为1 1元
中国农科新闻网是农业科技报社顺应网络时代新媒体发展趋势,在三农领域倾心打造的集资讯、互动、网上展示于一体的全媒体平台。
大汉没落之根源,不在宋,而在于这个王朝200年的奴化!,宋朝武风衰退,这个笔者认可,但这绝对不是大汉没落之本。宋朝一直在外敌压迫之下,辽
京媒透露马布里在赛季结束后确定离开北控江苏队战胜四川队后,达到了60积分,北控即使剩下的三场比赛全部赢了也只有59积分,因此北控彻底无缘
——ZAKER,个性化推荐热门新闻,本地权威媒体资讯
此次授出股权的行使价为59 4港元。
1、我的家乡我的家乡是一座文明古都,它有着2000多年的历史,在其浓厚的文化积淀中孕育出了著名的世界文化遗产,而且他是我
燃油附加费将迎今年第二次下调。 据“交通发布”微博3月30日消息,自2023年4月5日起,国内航班燃油费收取标准调整为:800公里以上航段每位
03月30日,凯莱英被深股通减持8 09万股,最新持股量为1016 41万股,占公司A股总股本的2 97%。
智通财经APP讯,大众公用(600635)(01635)发布公告,为客观、真实、准确地反映公司截至2022年12月31日的财务状况和2022年度经营成果,按照《
中国山东网-感知山东3月30日讯(记者杨广科通讯员刘欣)春天是雅致的,近有陌上花开,远有清浅草色。在这个美好时节,迎着和煦春风,约上三五好
本文转自:长江日报一句承诺,五年守护在孝南区车站街社区卫生服务中心食堂师傅汤林和妻子王守凤悉心照料着73岁的邱楚焕(化名)爹爹两个家庭
据中国国家医疗保障局网站3月30日消息,国家医保局、财政部、国家卫生健康委员会、国家疾病预防控制局日前就进一步做好新冠患
1、德意志电波是原联邦德国政府经办的对欧洲广播的电台。2、1962年开始播音,台址设在科隆,它同时兼办对内广播,现使
观点网讯。3月30日,重庆渝开发股份有限公司发布关于签定国有建设用地使用权出让合同修改协议的公告。据观点新媒体了解,2012年12月17日,渝开