当前位置: 首页 > news >正文

小刘网站建设seo是对网站进行什么优化

小刘网站建设,seo是对网站进行什么优化,快速刷排名seo软件,提供常州网站建设公司源码:point_down: seata-golang概述我们知道 Seata Java Client 的 AT 模式#xff0c;通过代理数据源#xff0c;实现了对业务代码无侵入的分布式事务协调机制#xff0c;将与 Transaction Coordinator (TC) 交互的逻辑、Commit 的逻辑、Rollback 的逻辑#xff0c;隐藏在…源码:point_down: seata-golang概述我们知道 Seata Java Client 的 AT 模式通过代理数据源实现了对业务代码无侵入的分布式事务协调机制将与 Transaction Coordinator (TC) 交互的逻辑、Commit 的逻辑、Rollback 的逻辑隐藏在切面和代理数据源相应的代码中使开发者无感知。那如果这个方法要用 Golang 来实现一遍应该如何操作呢关于这个问题我想了很久最初的设想是对 database/sql 的 mysql driver 进行增强在对包 github.com/go-sql-driver/mysql 研究了一段时间后还是没有头绪不知如何下手最后转而增强 database/sql 包。由于 AT 模式必须保证本地事务的正确处理在具体业务开发时首先要通过 db.Begin() 获得一个 Tx 对象然后再 tx.Exec() 执行数据库操作最后 tx.Commit() 提交或 tx.Rollback() 回滚。这种处理方式算是一个 Golang 数据库事务处理的基本操作。 所以对 database/sql 的增强我们重点关注这几个方法 db.Begin() 、 tx.Exec() 、 tx.Commit() 、 tx.Rollback 。事务提交、回滚通过 Seata Java Client 的相关代码我们知道在本地事务提交的时候主要是将分支事务注册到 TC 上并将数据库操作产生的 undoLog 一起写入到 undoLog 表本地事务回滚的时候需要将分支事务(即本地事务)的执行状态报告给 TC使 TC 好知道是否通知参与全局事务的其他分支回滚。func (tx *Tx) Commit() error { //注册分支事务branchId,err : tx.register()if err ! nil {return errors.WithStack(err)}tx.tx.Context.BranchId branchIdif tx.tx.Context.HasUndoLog() { //将 undoLog 写入 undoLog 表err manager.GetUndoLogManager().FlushUndoLogs(tx.tx)if err ! nil {err1 : tx.report(false)if err1 ! nil {return errors.WithStack(err1)}return errors.WithStack(err)}err tx.tx.Commit()if err ! nil {err1 : tx.report(false)if err1 ! nil {return errors.WithStack(err1)}return errors.WithStack(err)}} else {return tx.tx.Commit()}if tx.reportSuccessEnable {tx.report(true)}tx.tx.Context.Reset()return nil}db.Begin() 会产生一个 Tx 对象 tx.Exec() 会产生 undoLog tx.Commit() 将 undoLog 刷到数据库中。那么 undoLog 保存到哪里呢答案是 Tx_Context 中。type TxContext struct {*context.RootContextXid stringBranchId int64IsGlobalLockRequire boolLockKeysBuffer *model.SetSqlUndoItemsBuffer []*undo.SqlUndoLog}Commit() 方法中的 tx.tx.Context 第一个 tx 是封装的 Tx 对象第二个 tx 是 database/sql 的 Tx tx.tx.Context 则是 Tx_Contex。UndoLogManager 则是操作 undoLog 的核心对象处理 undoLog 的插入、删除并查询出 undoLog 用于回滚。func (tx *Tx) Rollback() error {err : tx.tx.Rollback()if tx.tx.Context.InGlobalTransaction() tx.tx.Context.IsBranchRegistered() { // 报告 TC 分支事务执行失败tx.report(false)}tx.tx.Context.Reset()return err}通过上面的代码呢我们知道增强型 Tx 对象需要向 TC 注册分支事务并报告分支事务的执行状态相应代码如下func (tx *Tx) register() (int64,error) {return dataSourceManager.BranchRegister(meta.BranchTypeAT,tx.tx.ResourceId,,tx.tx.Context.Xid,nil,tx.tx.Context.BuildLockKeys())}func (tx *Tx) report(commitDone bool) error {retry : tx.reportRetryCountfor retry 0 {var err errorif commitDone {err dataSourceManager.BranchReport(meta.BranchTypeAT, tx.tx.Context.Xid, tx.tx.Context.BranchId,meta.BranchStatusPhaseoneDone,nil)} else {err dataSourceManager.BranchReport(meta.BranchTypeAT, tx.tx.Context.Xid, tx.tx.Context.BranchId,meta.BranchStatusPhaseoneFailed,nil)}if err ! nil {logging.Logger.Errorf(Failed to report [%d/%s] commit done [%t] Retry Countdown: %d,tx.tx.Context.BranchId,tx.tx.Context.Xid,commitDone,retry)retry retry -1if retry 0 {return errors.WithMessagef(err,Failed to report branch status %t,commitDone)}}}return nil}和 TC 进行通信的主要逻辑还是在 DataSourceManager 里面。AT 模式涉及的两个关键对象 DataSourceManager、UndoLogManager 就浮出水面。一个用于远程 TC 交互一个用于本地数据库处理。事务执行func (tx *Tx) Exec(query string, args ...interface{}) (sql.Result, error) {var parser p.New() // 解析业务 sqlact,_ : parser.ParseOneStmt(query,,)deleteStmt,isDelete : act.(*ast.DeleteStmt)if isDelete {executor : DeleteExecutor{tx: tx.tx,sqlRecognizer: mysql.NewMysqlDeleteRecognizer(query,deleteStmt),values: args,}return executor.Execute()}insertStmt,isInsert : act.(*ast.InsertStmt)if isInsert {executor : InsertExecutor{tx: tx.tx,sqlRecognizer: mysql.NewMysqlInsertRecognizer(query,insertStmt),values: args,}return executor.Execute()}updateStmt,isUpdate : act.(*ast.UpdateStmt)if isUpdate {executor : UpdateExecutor{tx: tx.tx,sqlRecognizer: mysql.NewMysqlUpdateRecognizer(query,updateStmt),values: args,}return executor.Execute()}return tx.tx.Tx.Exec(query,args)}执行业务 sql并生成 undoLog 的关键在于识别业务 sql 执行了什么操作插入删除修改这里使用 tidb 的 sql parser 去解析业务 sql再使用相应的执行器去执行业务 sql生成 undoLog 保存在 Tx_Context 中。事务开启db.Begin() 返回增强型的 Tx 对象。func (db *DB) Begin(ctx *context.RootContext) (*Tx,error) {tx,err : db.DB.Begin()if err ! nil {return nil,err}proxyTx : tx2.ProxyTx{Tx: tx,DSN: db.conf.DSN,ResourceId: db.GetResourceId(),Context: tx2.NewTxContext(ctx),}return Tx{tx: proxyTx,reportRetryCount: db.conf.ReportRetryCount,reportSuccessEnable: db.conf.ReportSuccessEnable,},nil}seata-golang at 模式的使用sample 代码首先执行 scripts 脚本初始化数据库如果之前没有初始化过 seata 数据库先执行 seata-golang/scripts/server/db/mysql.sql 脚本修改 dsn 数据库配置修改下列文件seata-golang/tc/app/profiles/dev/config.ymlseata-golang/samples/at/product_svc/conf/client.ymlseata-golang/samples/at/product_svc/conf/client.yml将下列文件中的 configPath 修改为 client.yml 配置文件的路径seata-golang/samples/at/product_svc/main.goseata-golang/samples/at/order_svc/main.goseata-golang/samples/at/aggregation_svc/main.go依次运行 tc、order_svc、product_svc、aggragation_svc访问下列地址开始测试http://localhost:8003/createSoCommithttp://localhost:8003/createSoRollback
http://www.pierceye.com/news/925341/

相关文章:

  • 阿里巴巴网站建设与维护深圳民治网站建设
  • 郑州短视频代运营seo外链是什么
  • 网站建设公司 经营资质wordpress文学
  • 手机网站建设请示常州建设网站公司哪家好
  • 网站开发报价ppt重庆沙坪坝有哪些大学
  • 牛商网做的包装盒网站怎么在门户网站上发布
  • 北京网络公司建站成品app直播源码下载
  • 帮忙建站的公司百度收录好的网站排名
  • 芯火信息做网站怎么样郑州网站建设老牌公司
  • 龙华营销型网站建设在线生成短链接网址
  • 深圳做公司网站关键词规划师工具
  • 长春市建设信息网站sem代运营推广公司
  • 宜昌网站建设平台有经验的盐城网站开发
  • wordpress 众筹网站模板wordpress首页只显示一篇文章
  • 嘉兴seo网站推广网页设计与制作课程结构
  • 江苏 网站 备案百度站长之家工具
  • 新加坡 网站建设专业简历制作网站有哪些
  • 河北外贸网站建设大连建设网球场价格
  • 北京企业网站制作哪家好新余商城网站建设
  • 网站建设对客户的优势单位建设网站的目的
  • seo网站建站公司的主页珠江夜游微信公众号
  • 建筑人才网 中高端招聘网站专业网站开发开发
  • 江门官网建站公司wordpress get_tax_meta
  • 云南省建设系统网站wordpress wdlog主题
  • 做医疗网站颜色选择网站改版301怎么做
  • 淘宝网站建设步骤做网络网站需要三证么
  • 免费网站域名注册申请视频网站开发策划书
  • 如何在社交网站做销售无锡做网站企业
  • 网站建设首选唯美谷wordpress小程序编辑
  • openwrt 网站开发北京建机职业技能鉴定中心官网