整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript 高級(jí)入門(mén) 對(duì)象 (Object) 對(duì)象 實(shí)例

          avaScript 對(duì)象

          JavaScript 中的所有事物都是對(duì)象:字符串、數(shù)值、數(shù)組、函數(shù)...

          此外,JavaScript 允許自定義對(duì)象。

          JavaScript 對(duì)象

          JavaScript 提供多個(gè)內(nèi)建對(duì)象,比如 String、Date、Array 等等。

          對(duì)象只是帶有屬性方法的特殊數(shù)據(jù)類(lèi)型。

          訪問(wèn)對(duì)象的屬性

          屬性是與對(duì)象相關(guān)的值。

          訪問(wèn)對(duì)象屬性的語(yǔ)法是:

          _objectName_._propertyName_
          

          這個(gè)例子使用了 String 對(duì)象的 length 屬性來(lái)獲得字符串的長(zhǎng)度:

          var message="Hello World!";
          var x=message.`length`;
          

          在以上代碼執(zhí)行后,x 的值將是:

          12
          

          訪問(wèn)對(duì)象的方法

          方法是能夠在對(duì)象上執(zhí)行的動(dòng)作。

          您可以通過(guò)以下語(yǔ)法來(lái)調(diào)用方法:

          _objectName_._methodName_()
          

          這個(gè)例子使用了 String 對(duì)象的 toUpperCase() 方法來(lái)將文本轉(zhuǎn)換為大寫(xiě):

          var message="Hello world!";
          var x=message.`toUpperCase()`;
          

          在以上代碼執(zhí)行后,x 的值將是:

          HELLO WORLD!
          

          創(chuàng)建 JavaScript 對(duì)象

          通過(guò) JavaScript,您能夠定義并創(chuàng)建自己的對(duì)象。

          創(chuàng)建新對(duì)象有兩種不同的方法:

          1. 定義并創(chuàng)建對(duì)象的實(shí)例
          2. 使用函數(shù)來(lái)定義對(duì)象,然后創(chuàng)建新的對(duì)象實(shí)例

          創(chuàng)建直接的實(shí)例

          這個(gè)例子創(chuàng)建了對(duì)象的一個(gè)新實(shí)例,并向其添加了四個(gè)屬性:

          實(shí)例

          person=new Object();
          person.firstname="Bill";
          person.lastname="Gates";
          person.age=56;
          person.eyecolor="blue";
          

          替代語(yǔ)法(使用對(duì)象 literals):

          實(shí)例

          person={firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"};
          

          使用對(duì)象構(gòu)造器

          本例使用函數(shù)來(lái)構(gòu)造對(duì)象:

          實(shí)例

          function person(firstname,lastname,age,eyecolor)
          {
          this.firstname=firstname;
          this.lastname=lastname;
          this.age=age;
          this.eyecolor=eyecolor;
          }
          

          創(chuàng)建 JavaScript 對(duì)象實(shí)例

          一旦您有了對(duì)象構(gòu)造器,就可以創(chuàng)建新的對(duì)象實(shí)例,就像這樣:

          var myFather=new person("Bill","Gates",56,"blue");
          var myMother=new person("Steve","Jobs",48,"green");
          

          把屬性添加到 JavaScript 對(duì)象

          您可以通過(guò)為對(duì)象賦值,向已有對(duì)象添加新屬性:

          假設(shè) personObj 已存在 - 您可以為其添加這些新屬性:firstname、lastname、age 以及 eyecolor:

          person.firstname="Bill";
          person.lastname="Gates";
          person.age=56;
          person.eyecolor="blue";
          
          x=person.firstname;
          

          在以上代碼執(zhí)行后,x 的值將是:

          Bill
          

          把方法添加到 JavaScript 對(duì)象

          方法只不過(guò)是附加在對(duì)象上的函數(shù)。

          在構(gòu)造器函數(shù)內(nèi)部定義對(duì)象的方法:

          function person(firstname,lastname,age,eyecolor)
          {
          this.firstname=firstname;
          this.lastname=lastname;
          this.age=age;
          this.eyecolor=eyecolor;
          
          this.changeName=changeName;
          function changeName(name)
          {
          this.lastname=name;
          }
          }
          

          changeName() 函數(shù) name 的值賦給 person 的 lastname 屬性。

          現(xiàn)在您可以試一下:

          myMother.changeName("Ballmer");
          

          JavaScript 類(lèi)

          JavaScript 是面向?qū)ο蟮恼Z(yǔ)言,但 JavaScript 不使用類(lèi)。

          在 JavaScript 中,不會(huì)創(chuàng)建類(lèi),也不會(huì)通過(guò)類(lèi)來(lái)創(chuàng)建對(duì)象(就像在其他面向?qū)ο蟮恼Z(yǔ)言中那樣)。

          JavaScript 基于 prototype,而不是基于類(lèi)的。

          JavaScript for...in 循環(huán)

          JavaScript for...in 語(yǔ)句循環(huán)遍歷對(duì)象的屬性。

          語(yǔ)法

          for (對(duì)象中的變量)
            {
            要執(zhí)行的代碼
            }
          

          注釋?zhuān)篺or...in 循環(huán)中的代碼塊將針對(duì)每個(gè)屬性執(zhí)行一次。

          實(shí)例

          循環(huán)遍歷對(duì)象的屬性:

          var person={fname:"Bill",lname:"Gates",age:56};
          
          for (x in person)
            {
            txt=txt + person[x];
            }
          


          我建了一個(gè)前端學(xué)習(xí)群,有興趣學(xué)習(xí)的同學(xué)可以關(guān)注我:前端學(xué)習(xí)交流 - 知乎

          javascript對(duì)象

          javascript中的所有事物都是對(duì)象:字符串,數(shù)值,數(shù)組,函數(shù).....

          此外,javascript允許自定義對(duì)象.

          javascript提供多個(gè)內(nèi)建對(duì)象,比如:String,Date,Array等等.對(duì)象只是帶有屬性和方法的特殊數(shù)據(jù)類(lèi)型.

          ●布爾型可以是一個(gè)對(duì)象.

          ●數(shù)字型可以是一個(gè)對(duì)象.

          ●字符串可以是一個(gè)對(duì)象.

          ●日期是一個(gè)對(duì)象.

          ●正則表達(dá)式也是對(duì)象.

          ●數(shù)組是一個(gè)對(duì)象.

          ●甚至函數(shù)也可以是對(duì)象

          var person={name:"John",age:31, favColor:"green",height:178};

          屬性:name,屬性值:John. 以此類(lèi)推.

          javascript對(duì)象屬性

          可以通過(guò)兩種方式訪問(wèn)對(duì)象屬性.

          objectName.propertyName

          或者objectName['propertyName']

          javascript的內(nèi)置長(zhǎng)度屬性用于計(jì)算屬性或字符串中的字符數(shù).

          var course={name:"JS",lesson:34};

          document.write(course.name.length)

          // ->2

          對(duì)象方法

          對(duì)象方法是一個(gè)包含函數(shù)定義的屬性.

          調(diào)用方法:

          objectName.methodName()

          使用String對(duì)象的toUpperCase()方法來(lái)將文本轉(zhuǎn)換為大寫(xiě):

          var message="Coffee is lonely without cups";

          var x=message.toUpperCase();

          這樣Coffee is lonely without cups 就會(huì)變成COFFEE IS LONELY WITHOUT CUPS

          方法是作為對(duì)象屬性存儲(chǔ)的函數(shù).

          二 對(duì)象構(gòu)造器

          使用函數(shù)來(lái)構(gòu)建對(duì)象:

          function person(firstname,lastname,age,eyecolor){

          this.firstname=firstname;

          this.lastname=lastname;

          this.age=age;

          this.eyecolor=eyecolor; }

          在javascript中,this通常指向我們正在執(zhí)行的函數(shù)本身,或者指向該函數(shù)所屬的對(duì)象(運(yùn)行時(shí))

          創(chuàng)建javascript對(duì)象實(shí)例

          一旦你有了對(duì)象構(gòu)造器,就可以創(chuàng)建新的對(duì)象實(shí)例.

          var myFather= new person("John","Doe",50,"blue");

          var myMother=new person("Sally","Rally",48,"green") ;

          document.write(myFather.age); //->50

          document.write(myMother.name);//->Sally

          myFather和myMother是person對(duì)象的實(shí)例.

          三 對(duì)象初始化

          使用對(duì)象literal或initializer語(yǔ)法創(chuàng)建單個(gè)對(duì)象.(literal:字面量.initializer:初始化程序,初始化器)

          var John={name:"John",age:25};

          var Loen={name:"Loen",age:28};

          使用對(duì)象初始化器

          空格和換行符并不重要.對(duì)象定義可以跨多行.

          var John={

          name:"John",

          age:25};

          var Loen={

          name:"Loen",

          age:28};

          無(wú)論如何創(chuàng)建對(duì)象,訪問(wèn)屬性和方法的語(yǔ)法不會(huì)改變.

          document.write(Loen.age);

          四 添加方法

          方法是存儲(chǔ)在對(duì)象屬性中的函數(shù).

          創(chuàng)建對(duì)象函數(shù):

          function methodName(){code lines }

          訪問(wèn)對(duì)象函數(shù):

          objectName.methodName()

          this關(guān)鍵字是當(dāng)前對(duì)象的引用,這意味著你可以使用this來(lái)訪問(wèn)對(duì)象屬性和方法.

          在構(gòu)造函數(shù)中定義方法:

          function person(name,age){

          this.name=name;

          this.age=age;

          this.changeName=function (name){

          this.name=name;}

          }

          var p=new person("Loen",28);

          p.changeName("John");

          在上面的例子中,我們定義了一個(gè)名為changeName的方法,該方法是一個(gè)函數(shù),它接受參數(shù)名稱(chēng)并將其分配給對(duì)象的name屬性.

          添加方法:

          可以在構(gòu)造函數(shù)的外部定義一個(gè)函數(shù),通過(guò)函數(shù)名關(guān)聯(lián)到對(duì)象的屬性上;

          function person(name,age){

          this.name=name;

          this.age=age;

          this.yearOfBirth=bornYear; //關(guān)聯(lián)bornYear函數(shù)

          }

          function bornYear(){

          return new Date().getFullYear()-this.age(); }

          以上的代碼中new Date().getFullYear()是獲取今年完整的年份時(shí)間.如:2018.

          我們已將對(duì)象的yearOfBirth屬性賦予bornYear函數(shù).當(dāng)通過(guò)對(duì)象調(diào)用bornYear函數(shù)時(shí),bornYear函數(shù)中的this指向這個(gè)對(duì)象.

          將函數(shù)關(guān)聯(lián)到對(duì)象屬性時(shí)不需要寫(xiě)函數(shù)后邊的括號(hào).

          調(diào)用方法:

          function person(name,age){

          this.name=name;

          this.age=age;

          this.yearOfBirth=bornYear;

          }

          function bornYear(){

          return new Date().getFullYear()-this.age; }

          var p=new person("Loen",27);

          document.write(p.yearOfBirth());

          // ->1991

          通過(guò)對(duì)象的屬性名調(diào)用函數(shù)而不是直接調(diào)用函數(shù).

          每天堅(jiān)持進(jìn)步一點(diǎn)點(diǎn)!

          、背景

          在seata整合nacos完成分布式的部署中,我們學(xué)習(xí)了Seata的集群部署,在這篇文章中,我們使用SpringBoot整合Seata實(shí)現(xiàn)分布式事務(wù)功能,此處使用的是Seata的AT模式。

          二、實(shí)現(xiàn)功能

          我們存在2個(gè)服務(wù) 賬戶服務(wù) account-service 和 訂單服務(wù) order-service,在訂單服務(wù)中調(diào)用 賬戶服務(wù)。

          訂單服務(wù)中調(diào)用賬戶服務(wù)是通過(guò) RestTemplate來(lái)實(shí)現(xiàn)的。

          測(cè)試場(chǎng)景:

          1、賬戶服務(wù)正常,訂單服務(wù)正常,結(jié)果:賬戶服務(wù)正常扣款,產(chǎn)生訂單。

          2、賬戶服務(wù)正常,訂單服務(wù)正常,在整個(gè)分布式事務(wù)中發(fā)生了異常,結(jié)果: 賬戶服務(wù)沒(méi)有扣款,沒(méi)有產(chǎn)生訂單。

          三、每個(gè)服務(wù)使用到的技術(shù)

          1、賬戶服務(wù)

          SpringBoot、Seata、Mybatis、nacos、druid

          2、訂單服務(wù)

          SpringBoot、Seata、Mybatis、nacos、Hikari

          其中 SpringBoot 整合 Seata 是通過(guò) seata-spring-boot-starter 這個(gè)來(lái)實(shí)現(xiàn)的,不使用 seata-all來(lái)實(shí)現(xiàn)。

          四、服務(wù)實(shí)現(xiàn)

          1、賬戶服務(wù)實(shí)現(xiàn)

          賬戶服務(wù),提供一個(gè)簡(jiǎn)單的扣除賬戶余額的功能,比較簡(jiǎn)單。

          注意項(xiàng):

          1、開(kāi)啟自動(dòng)數(shù)據(jù)源代理。

          2、引入druid,不需要自動(dòng)配置數(shù)據(jù)源。

          3、注意事務(wù)分組

          1、引入jar包

          此處只引入幾個(gè) 核心的 包,其余的包沒(méi)有列在下方,比如mybatis等,注意和seata整合使用的是seata-spring-boot-starter

          <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.4.2</version>
          </dependency>
          <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.4</version>
          </dependency>
          <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.3.2</version>
          </dependency>
          

          2、項(xiàng)目配置

          3、建表語(yǔ)句

          create database seata_account;
          use seata_account;
          create table account(
              id int unsigned auto_increment primary key comment '主鍵',
              name varchar(20) comment '用戶名',
              balance bigint comment '賬戶余額,單位分'
          ) engine=InnoDB comment '賬戶表';
          insert into account(id,name,balance) values (1,'張三',100000);
          CREATE TABLE IF NOT EXISTS `undo_log`
          (
              `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
              `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
              `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
              `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
              `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
              `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
              `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
              UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
          ) ENGINE = InnoDB COMMENT ='AT transaction mode undo table';
          

          每個(gè)業(yè)務(wù)庫(kù)必須存在一張 undo_log表

          2、訂單服務(wù)實(shí)現(xiàn)

          提供一個(gè)接口,實(shí)現(xiàn)產(chǎn)生訂單,扣除賬戶余額。

          注意事項(xiàng):

          1、訂單服務(wù) 關(guān)閉默認(rèn)的數(shù)據(jù)源代理,自己配置數(shù)據(jù)源代理。

          2、使用 Hikari數(shù)據(jù)源來(lái)實(shí)現(xiàn),因?yàn)槭褂玫氖?AT模式,所以需要使用 DataSourceProxy 來(lái)代理數(shù)據(jù)源。

          3、訂單服務(wù)調(diào)用賬戶服務(wù)是采用的 RestTemplate,因此需要手動(dòng)配置RestTemplate的攔截器,實(shí)現(xiàn)xid的傳輸。

          4、在seata1.4.2中存在一個(gè)bug,如果業(yè)務(wù)表中數(shù)據(jù)類(lèi)型是datetime類(lèi)型,可能undolog無(wú)法序列化成功,可以采用timestamp或別的方式來(lái)處理。

          5、業(yè)務(wù)庫(kù)中需要存在 undo_log 表。

          1、引入jar包

          此處不引入 druid,注意和seata整合使用的是seata-spring-boot-starter

          <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.4.2</version>
          </dependency>
          <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.3.2</version>
          </dependency>
          

          2、項(xiàng)目配置

          3、配置數(shù)據(jù)源代理

          package com.huan.seata.config;
          
          import com.zaxxer.hikari.HikariDataSource;
          import io.seata.rm.datasource.DataSourceProxy;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          
          import javax.sql.DataSource;
          
          @Configuration
          public class DataSourceConfig {
          
              @Autowired
              private DataSourceProperties dataSourceProperties;
          
              @Bean
              public DataSource dataSourceProxy() {
                  HikariDataSource hikariDataSource = new HikariDataSource();
                  hikariDataSource.setJdbcUrl(dataSourceProperties.getUrl());
                  hikariDataSource.setUsername(dataSourceProperties.getUsername());
                  hikariDataSource.setPassword(dataSourceProperties.getPassword());
                  hikariDataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
                  return new DataSourceProxy(hikariDataSource);
              }
          }
          

          在 AT模式種,數(shù)據(jù)源代理一定要是 DataSourceProxy這個(gè)。

          4、配置RestTemplate傳遞xid

          5、@GlobalTransactional分布式事務(wù)

          @Service
          @RequiredArgsConstructor
          @Slf4j
          public class BusinessServiceImpl implements BusinessService {
          
              private final OrderService orderService;
              private final RestTemplate restTemplate;
          
              @Override
              @GlobalTransactional(rollbackFor = Exception.class)
              public void createAccountOrder(Integer accountId, Long amount, boolean hasException) {
                  System.out.println("createAccountOrder:" + RootContext.getXID());
                  // 1、遠(yuǎn)程扣減賬戶余額
                  remoteDebit(accountId, amount);
          
                  // 2、下訂單
                  orderService.createOrder(accountId, amount);
          
                  if (hasException) {
                      throw new RuntimeException("發(fā)生了異常,分布式事物需要會(huì)滾");
                  }
              }
          
              private void remoteDebit(Integer accountId, Long amount) {
                  String url = "http://localhost:50001/account/debit?id=" + accountId + "&amount=" + amount;
                  String result = restTemplate.getForObject(url, String.class);
                  log.info("遠(yuǎn)程扣減庫(kù)存結(jié)果:[{}]", result);
              }
          }
          

          3、事務(wù)分組需要和配置中心對(duì)應(yīng)上

          此處以訂單服務(wù)來(lái)演示,如何和配置中心對(duì)應(yīng)上的。

          每個(gè)服務(wù)的事務(wù)分組可能不一樣,但是需要和配置中心對(duì)應(yīng)上。
          比如:
          order-service 中的配置分組為:seata.tx-service-group=tx_order_service_group
          配置中心必須存在 service.vgroupMapping.tx_order_service_group=default 配置項(xiàng),default是集群,是服務(wù)端配置文件中指定的
          

          五、演示

          1、沒(méi)有發(fā)生異常

          訪問(wèn):http://localhost:50002/createOrder?accountId=1&amount=10&hasException=false

          正常創(chuàng)建訂單,和扣除余額。

          2、發(fā)生異常

          訪問(wèn): http://localhost:50002/createOrder?accountId=1&amount=10&hasException=true

          不產(chǎn)生訂單,不扣除余額。

          六、可能遇到的問(wèn)題

          1.Nacos 作為 Seata 配置中心時(shí),項(xiàng)目啟動(dòng)報(bào)錯(cuò)找不到服務(wù)。如何排查,如何處理?

          A: 異常:io.seata.common.exception.FrameworkException: can not register RM,err:can not connect to services-server.

          1. 查看nacos配置列表,seata配置是否已經(jīng)導(dǎo)入成功
          2. 查看nacos服務(wù)列表,serverAddr是否已經(jīng)注冊(cè)成功
          3. 檢查client端的registry.conf里面的namespace,registry.nacos.namespace和config.nacos.namespace填入nacos的命名空間ID,默認(rèn)"",server端和client端對(duì)應(yīng),namespace 為public是nacos的一個(gè)保留控件,如果您需要?jiǎng)?chuàng)建自己的namespace,最好不要和public重名,以一個(gè)實(shí)際業(yè)務(wù)場(chǎng)景有具體語(yǔ)義的名字來(lái)命名
          4. nacos上服務(wù)列表,serverAddr地址對(duì)應(yīng)ip地址應(yīng)為seata啟動(dòng)指定ip地址,如:sh seata-server.sh -p 8091 -h 122.51.204.197 -m file
          5. 查看seata/conf/nacos-config.txt 事務(wù)分組service.vgroupMapping.trade_group=default配置與項(xiàng)目分組配置名稱(chēng)是否一致
          6. telnet ip 端口 查看端口是否開(kāi)放,以及防火墻狀態(tài)

          2、使用 AT 模式需要的注意事項(xiàng)有哪些 ?

          1. 必須使用代理數(shù)據(jù)源,有 3 種形式可以代理數(shù)據(jù)源:
          2. 依賴(lài) seata-spring-boot-starter 時(shí),自動(dòng)代理數(shù)據(jù)源,無(wú)需額外處理。
          3. 依賴(lài) seata-all 時(shí),使用 @EnableAutoDataSourceProxy (since 1.1.0) 注解,注解參數(shù)可選擇 jdk 代理或者 cglib 代理。
          4. 依賴(lài) seata-all 時(shí),也可以手動(dòng)使用 DatasourceProxy 來(lái)包裝 DataSource。
          5. 配置 GlobalTransactionScanner,使用 seata-all 時(shí)需要手動(dòng)配置,使用 seata-spring-boot-starter 時(shí)無(wú)需額外處理。
          6. 業(yè)務(wù)表中必須包含單列主鍵,若存在復(fù)合主鍵,請(qǐng)參考問(wèn)題 13 。
          7. 每個(gè)業(yè)務(wù)庫(kù)中必須包含 undo_log 表,若與分庫(kù)分表組件聯(lián)用,分庫(kù)不分表。
          8. 跨微服務(wù)鏈路的事務(wù)需要對(duì)相應(yīng) RPC 框架支持,目前 seata-all 中已經(jīng)支持:Apache Dubbo、Alibaba Dubbo、sofa-RPC、Motan、gRpc、httpClient,對(duì)于 Spring Cloud 的支持,請(qǐng)大家引用 spring-cloud-alibaba-seata。其他自研框架、異步模型、消息消費(fèi)事務(wù)模型請(qǐng)結(jié)合 API 自行支持。
          9. 目前AT模式支持的數(shù)據(jù)庫(kù)有:MySQL、Oracle、PostgreSQL和 TiDB。
          10. 使用注解開(kāi)啟分布式事務(wù)時(shí),若默認(rèn)服務(wù) provider 端加入 consumer 端的事務(wù),provider 可不標(biāo)注注解。但是,provider 同樣需要相應(yīng)的依賴(lài)和配置,僅可省略注解。
          11. 使用注解開(kāi)啟分布式事務(wù)時(shí),若要求事務(wù)回滾,必須將異常拋出到事務(wù)的發(fā)起方,被事務(wù)發(fā)起方的 @GlobalTransactional 注解感知到。provide 直接拋出異常 或 定義錯(cuò)誤碼由 consumer 判斷再拋出異常。

          3、AT 模式和 Spring @Transactional 注解連用時(shí)需要注意什么 ?

          @Transactional 可與 DataSourceTransactionManager 和 JTATransactionManager 連用分別表示本地事務(wù)和XA分布式事務(wù),大家常用的是與本地事務(wù)結(jié)合。當(dāng)與本地事務(wù)結(jié)合時(shí),@Transactional和@GlobalTransaction連用,@Transactional 只能位于標(biāo)注在@GlobalTransaction的同一方法層次或者位于@GlobalTransaction 標(biāo)注方法的內(nèi)層。這里分布式事務(wù)的概念要大于本地事務(wù),若將 @Transactional 標(biāo)注在外層會(huì)導(dǎo)致分布式事務(wù)空提交,當(dāng)@Transactional 對(duì)應(yīng)的 connection 提交時(shí)會(huì)報(bào)全局事務(wù)正在提交或者全局事務(wù)的xid不存在。

          4、數(shù)據(jù)庫(kù)開(kāi)啟自動(dòng)更新時(shí)間戳導(dǎo)致臟數(shù)據(jù)無(wú)法回滾

          由于業(yè)務(wù)提交,seata記錄當(dāng)前鏡像后,數(shù)據(jù)庫(kù)又進(jìn)行了一次時(shí)間戳的更新,導(dǎo)致鏡像校驗(yàn)不通過(guò)。

          解決方案1: 關(guān)閉數(shù)據(jù)庫(kù)的時(shí)間戳自動(dòng)更新。數(shù)據(jù)的時(shí)間戳更新,如修改、創(chuàng)建時(shí)間由代碼層面去維護(hù),比如MybatisPlus就能做自動(dòng)填充。

          解決方案2: update語(yǔ)句別把沒(méi)更新的字段也放入更新語(yǔ)句。

          5、Seata 使用注冊(cè)中心注冊(cè)的地址有什么限制?

          Seata 注冊(cè)中心不能注冊(cè) 0.0.0.0 或 127.0.0.1 的地址,當(dāng)自動(dòng)注冊(cè)為上述地址時(shí)可以通過(guò)啟動(dòng)參數(shù) -h 或容器環(huán)境變量SEATA_IP來(lái)指定。當(dāng)和業(yè)務(wù)服務(wù)處于不同的網(wǎng)絡(luò)時(shí)注冊(cè)地址可以指定為 NAT_IP或公網(wǎng)IP,但需要保證注冊(cè)中心的健康檢查探活是通暢的。

          以上的幾個(gè)問(wèn)題,來(lái)自seata官網(wǎng) : http://seata.io/zh-cn/docs/overview/faq.html

          七、代碼地址

          代碼地址:https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springboot-mybatis


          主站蜘蛛池模板: 无遮挡免费一区二区三区| 国精产品一区一区三区MBA下载| 高清一区二区三区视频| 国产一区二区电影| 亚洲AV香蕉一区区二区三区| 午夜一区二区在线观看| 精品综合一区二区三区| 精品国产一区二区三区麻豆 | 中文字幕在线观看一区二区| 中文字幕av日韩精品一区二区| 亚洲av高清在线观看一区二区 | 日本高清无卡码一区二区久久| 久久久一区二区三区| 日本高清成本人视频一区| 国产精品成人免费一区二区| 人妻aⅴ无码一区二区三区| 久久久久人妻一区精品果冻| 波多野结衣在线观看一区二区三区| 无码囯产精品一区二区免费| 亚洲综合无码AV一区二区| 久久精品国产一区二区| 国产激情一区二区三区成人91 | 中文字幕精品亚洲无线码一区应用 | 国产激情精品一区二区三区| 夜夜精品无码一区二区三区| 国产在线一区二区三区av| 国产精品亚洲综合一区在线观看| 午夜视频在线观看一区| 日美欧韩一区二去三区| 精品视频一区二区| 成人精品视频一区二区三区| 国产成人精品一区二三区在线观看| 一区二区三区免费看| 视频一区二区三区免费观看| 视频在线观看一区二区| 伊人色综合一区二区三区 | 天堂一区二区三区精品| 国产主播福利精品一区二区| 中文国产成人精品久久一区| 无码乱人伦一区二区亚洲| 精品国产乱子伦一区二区三区 |