日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

druid seata 配置_五分钟带你了解Seata分布式事务

發(fā)布時間:2025/3/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 druid seata 配置_五分钟带你了解Seata分布式事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.Seata介紹

Seata是由阿里中間件團隊發(fā)起的開源項目 Fescar,后更名為Seata,它是一個是開源的分布式事務(wù)框架。

傳統(tǒng)2PC的問題在Seata中得到了解決,它通過對本地關(guān)系數(shù)據(jù)庫的分支事務(wù)的協(xié)調(diào)來驅(qū)動完成全局事務(wù)。

是工作在應(yīng)用層的中間件。主要優(yōu)點是性能較好,且不長時間占用連接資源,它以高效并且對業(yè)務(wù)0侵入的方式解決微服 務(wù)場景下面臨的分布式事務(wù)問題,它目前提供AT模式(即2PC)及TCC模式的分布式事務(wù)解決方案。

1.1. Seata的設(shè)計思想

seata 采用的是大量運用在數(shù)據(jù)庫軟件的 Write Ahead Log 思想,即把事務(wù)的信息以事務(wù)日志的方式記錄下來。這種處理方式,實際上是對傳統(tǒng)兩階段提交的一種改進和優(yōu)化。主要有幾個關(guān)鍵點:

  • 傳統(tǒng)兩階段提交協(xié)議是阻塞協(xié)議,性能差
  • 傳統(tǒng)兩階段提交協(xié)議高可用性不好
  • 傳統(tǒng)兩階段提交協(xié)議的全局事務(wù)隔離機制不支持
  • 根據(jù)八二原則,80% 的涉及到全局事務(wù)的業(yè)務(wù)是能正常完成并提交的。
  • 因此,seata 采取的做法是,一個事務(wù)分支的數(shù)據(jù)庫操作執(zhí)行完后,馬上進行本地事務(wù)的提交,從而釋放相關(guān)的數(shù)據(jù)庫 資源。

    • 分支事務(wù)中數(shù)據(jù)的 本地鎖 由本地事務(wù)管理,在分支事務(wù) Phase1 結(jié)束時釋放。·
    • 同時,隨著本地事務(wù)結(jié)束,連接 也得以釋放。·
    • 分支事務(wù)中數(shù)據(jù)的 全局鎖 在事務(wù)協(xié)調(diào)器側(cè)管理,在決議 Phase2 全局提交時,全局鎖馬上可以釋放。只有在決議全 局回滾的情況下,全局鎖 才被持有至分支的 Phase2 結(jié)束。

    1.2.本地事務(wù)執(zhí)行流程

    在進行本地提交的前提是,seata 會解析 SQL,獲取數(shù)據(jù)庫表的元數(shù)據(jù),根絕 SQL 類型,選擇性地生成數(shù)據(jù)的前置鏡像和后置鏡像, 保存在 undolog 表中,并且要求與保存 undolog 與業(yè)務(wù) SQL 在同一個本地事務(wù)內(nèi)。

    這就保證了:

  • 如果一個本地事務(wù)被提交,那么必定對應(yīng)著相應(yīng)的 undo_log
  • 如果保存 undo_log 保存失敗,那么業(yè)務(wù) SQL 也會失敗
  • 1.3.全局事務(wù)提交流程

    因為每個分支事務(wù)的本地事務(wù)都已經(jīng)被提交,所以如果全局事務(wù)能夠順利進行到“提交“這一階段,那么意味著所有事務(wù)分支的本地事 務(wù)都已經(jīng)被提交了,數(shù)據(jù)的一致性已經(jīng)得到了保證。

    這個時候全局事務(wù)的提交就變得十分輕量級,就是把 undo_log 對應(yīng)的記錄刪掉即可,即使是當(dāng)時刪除失敗了,也已經(jīng)不會影響全局事 務(wù)的最終結(jié)果,這次刪不了,那就待會再刪,程序刪不了,沒事,頂多人工刪。

    1.4.全局事務(wù)回滾流程

    如果全局事務(wù)的任何一個事務(wù)分支失敗了,那么全局事務(wù)就進入“回滾“流程,回滾時依據(jù)先前保存好數(shù)據(jù)鏡像,將原來的數(shù)據(jù)回放回去。

    如果全局回放成功,那么數(shù)據(jù)的一致性也就得到了保證,如果回放不成功,那么事務(wù)就進入異常。應(yīng)對異常,可能需要重試,可能需要人工介入。

    2.Seata在dubbo中的使用

    2.1.新增mvn依賴

    在需要增加分布式事務(wù)的模塊加上相關(guān)依賴

    1. `<dependency>`2. `<groupId>io.seata</groupId>`3. `<artifactId>seata-spring-boot-starter</artifactId>`4. `<version>1.1.0</version>`5. `</dependency>`

    2.2.修改properties文件

    1. `#服務(wù)名稱`2. `dubbo.application.name=service`3. `#注冊中心地址`4. `dubbo.registry.address=127.0.0.1:2181`5. `#注冊中心類型`6. `dubbo.registry.protocol=zookeeper`7. `#版本號`8. `dubbo.application.version=3`9. `# Dubbo Protocol`10. `#協(xié)議名稱`11. `dubbo.protocol.name=dubbo`12. `#服務(wù)暴露端口`13. `dubbo.protocol.port=20880`18. `seata.enabled=true`19. `seata.application-id=biz-service`20. `seata.tx-service-group=my_test_tx_group`21. `seata.client.rm.async-commit-buffer-limit=1000`22. `seata.client.rm.report-retry-count=5`23. `seata.client.rm.table-meta-check-enable=false`24. `seata.client.rm.report-success-enable=false`25. `seata.client.rm.lock.retry-interval=10`26. `seata.client.rm.lock.retry-times=30`27. `seata.client.rm.lock.retry-policy-branch-rollback-on-conflict=true`28. `seata.client.tm.commit-retry-count=5`29. `seata.client.tm.rollback-retry-count=5`30. `seata.client.undo.data-validation=true`31. `seata.client.undo.log-serialization=jackson`32. `seata.client.undo.log-table=undo_log`33. `seata.client.log.exceptionRate=100`34. `seata.service.vgroup-mapping.my_test_tx_group=default`35. `seata.service.grouplist.default=127.0.0.1:8091`36. `seata.transport.shutdown.wait=3`37. `seata.transport.thread-factory.boss-thread-prefix=NettyBoss`38. `seata.transport.thread-factory.worker-thread-prefix=NettyServerNIOWorker`39. `seata.transport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler`40. `seata.transport.thread-factory.share-boss-worker=false`41. `seata.transport.thread-factory.client-selector-thread-prefix=NettyClientSelector`42. `seata.transport.thread-factory.client-selector-thread-size=1`43. `seata.transport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread`44. `seata.transport.thread-factory.worker-thread-size=default`45. `seata.transport.thread-factory.boss-thread-size=1`46. `seata.transport.type=TCP`47. `seata.transport.server=NIO`48. `seata.transport.heartbeat=true`49. `seata.transport.serialization=seata`50. `seata.transport.compressor=none`51. `seata.transport.enable-client-batch-send-request=true`52. `seata.config.type=file`53. `seata.registry.type=file`

    2.3.新增配置類

    1. `package cn.enjoy.mt.order.config;`2. `import com.alibaba.druid.pool.DruidDataSource;`3. `import org.apache.ibatis.session.SqlSessionFactory;`4. `import org.mybatis.spring.SqlSessionFactoryBean;`5. `import org.springframework.boot.context.properties.ConfigurationProperties;`6. `import org.springframework.context.annotation.Bean;`7. `import org.springframework.context.annotation.Configuration;`8. `import org.springframework.core.io.support.PathMatchingResourcePatternResolver;`9. `import javax.sql.DataSource;`10. `@Configuration`11. `public class SeataConfiguration {`12. `@Bean`14. `@ConfigurationProperties(prefix = "spring.datasource")`16. `public DataSource druidDataSource() {`18. `DruidDataSource druidDataSource = new DruidDataSource();`20. `return druidDataSource;`22. `}`24. `@Bean`25. `public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {`27. `SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();`29. `factoryBean.setDataSource(dataSource);`31. `factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()`33. `.getResources("classpath:/mapping/.xml"));`35. `return factoryBean.getObject();`37. `}`38. `}`

    2.4.新增undo_log日志表

    1. `CREATE TABLE undo_log (`2. `id bigint(20) NOT NULL AUTO_INCREMENT,`3. `branch_id bigint(20) NOT NULL,`4. `xid varchar(100) NOT NULL,`5. `context varchar(128) NOT NULL,`6. `rollback_info longblob NOT NULL,`7. `log_status int(11) NOT NULL,`8. `log_created datetime NOT NULL,`9. `log_modified datetime NOT NULL,`10. `ext varchar(100) DEFAULT NULL,`11. `PRIMARY KEY (id),`12. `UNIQUE KEY ux_undo_log (xid,branch_id)`13. `) ENGINE=InnoDB DEFAULT CHARSET=utf8;`

    2.5.SeataProperties

    1. `package cn.enjoy.mt.order.config;`2. `import org.springframework.boot.context.properties.ConfigurationProperties;`3. `@ConfigurationProperties("spring.cloud.alibaba.seata")`4. `public class SeataProperties {`5. `private String txServiceGroup;`6. `public SeataProperties() {`7. `}`8. `public String getTxServiceGroup() {`9. `return this.txServiceGroup;`10. `}`11. `public void setTxServiceGroup(String txServiceGroup) {`12. `this.txServiceGroup = txServiceGroup;`13. `}`14. `}`

    2.6.修改啟動類

    1. `package cn.enjoy.mt.order;`2. `import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;`3. `import org.mybatis.spring.annotation.MapperScan;`4. `import org.springframework.boot.SpringApplication;`5. `import org.springframework.boot.autoconfigure.SpringBootApplication;`6. `import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;`7. `import org.springframework.cache.annotation.EnableCaching;`8. `import org.springframework.context.annotation.PropertySource;`9. `@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)`10. `@EnableDubbo`11. `@PropertySource("classpath:mt_db.properties")`12. `@MapperScan("cn.enjoy.mt.dao")`13. `@EnableCaching`14. `public class OrderServiceApp {`15. `public static void main(String[] args) {`16. `SpringApplication.run(OrderServiceApp.class,args);`17. `}`18. `}`

    2.7.增加 @GlobalTransactional注解

    2.7.1.產(chǎn)品服務(wù)

    1. `@GlobalTransactional`2. `public void deleteById(Integer id) {`3. `orderService.deleteByProductId(id);`4. `int i = 10/0;`5. `productInfoMapper.deleteByPrimaryKey(id);`6. `}`

    2.7.2.訂單服務(wù)

    1. `@Override`3. `@GlobalTransactional`5. `public void deleteByProductId(int id) {`7. `orderInfoMapper.deleteByProductId(id);`9. `}`

    總結(jié)

    以上是生活随笔為你收集整理的druid seata 配置_五分钟带你了解Seata分布式事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。