国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Spring中使用atomikos+druid實現經典分布式事務的方法

Spring中使用atomikos+druid實現經典分布式事務的方法

2019-06-30 21:07馮立彬 Java教程

這篇文章主要介紹了Spring中使用atomikos+druid實現經典分布式事務的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

經典分布式事務,是相對互聯網中的柔性分布式事務而言,其特性為ACID原則,包括原子性(Atomictiy)、一致性(Consistency)、隔離性(Isolation)、持久性(Durabilit):

  • 原子性:事務是一個包含一系列操作的原子操作。事務的原子性確保這些操作全部完成或者全部失敗。
  • 一致性:一旦事務的所有操作結束,事務就被提交。然后你的數據和資源將處于遵循業務規則的一直狀態。
  • 隔離性:因為同時在相同數據集上可能有許多事務處理,每個事務應該與其他事務隔離,避免數據破壞。
  • 持久性:一旦事務完成,他的結果應該能夠承受任何系統錯誤(想象一下在事務提交過程中機器的電源被切斷的情況)。通常,事務的結果被寫入持續性存儲。

XA是啥?

XA是由X/Open組織提出的分布式事務的架構(或者叫協議)。XA架構主要定義了(全局)事務管理器(Transaction Manager)和(局部)資源管理器(Resource Manager)之間的接口。XA接口是雙向的系統接口,在事務管理器(Transaction Manager)以及一個或多個資源管理器(Resource Manager)之間形成通信橋梁。也就是說,在基于XA的一個事務中,我們可以針對多個資源進行事務管理,例如一個系統訪問多個數據庫,或即訪問數據庫、又訪問像消息中間件這樣的資源。這樣我們就能夠實現在多個數據庫和消息中間件直接實現全部提交、或全部取消的事務。XA規范不是java的規范,而是一種通用的規范,

目前各種數據庫、以及很多消息中間件都支持XA規范。

JTA是滿足XA規范的、用于Java開發的規范。所以,當我們說,使用JTA實現分布式事務的時候,其實就是說,使用JTA規范,實現系統內多個數據庫、消息中間件等資源的事務。

JTA(Java Transaction API),是J2EE的編程接口規范,它是XA協議的JAVA實現。它主要定義了:

  • 一個事務管理器的接口javax.transaction.TransactionManager,定義了有關事務的開始、提交、撤回等>操作。
  • 一個滿足XA規范的資源定義接口javax.transaction.xa.XAResource,一種資源如果要支持JTA事務,就需要讓它的資源實現該XAResource接口,并實現該接口定義的兩階段提交相關的接口。如果我們有一個應用,它使用JTA接口實現事務,應用在運行的時候,就需要一個實現JTA的容器,一般情況下,這是一個J2EE容器,像JBoss,Websphere等應用服務器。但是,也有一些獨立的框架實現了JTA,例如 Atomikos, bitronix 都提供了jar包方式的JTA實現框架。這樣我們就能夠在Tomcat或者Jetty之類的服務器上運行使用JTA實現事務的應用系統。在上面的本地事務和外部事務的區別中說到,JTA事務是外部事務,可以用來實現對多個資源的事務性。它正是通過每個資源實現的XAResource來進行兩階段提交的控制。感興趣的同學可以看看這個接口的方法,除了commit, rollback等方法以外,還有end(), forget(), isSameRM(), prepare()等等。光從這些接口就能夠想象JTA在實現兩階段事務的復雜性。

本篇以Spring MVC+Maven+Atomikos+Druid+MyBatis演示分布式事務的實現。

Mave 的pom.xml

001<properties>
002 <jdk.version>1.8</jdk.version>
003 <!-- 注mysql的版本和druid的版本一定要搭配,否則會有問題,目前這兩個版本是搭配好的 -->
004 <mysql.version>8.0.11</mysql.version>
005 <druid.version>1.1.17</druid.version>
006 <spring.version>5.1.8.RELEASE</spring.version>
007 <cglib.version>3.2.12</cglib.version>
008 <atomikos.version>5.0.0</atomikos.version>
009 <aspectjweaver.version>1.9.4</aspectjweaver.version>
010 <aspectjrt.version>1.5.4</aspectjrt.version>
011 <jta.version>1.1</jta.version>
012 <mybatise.version>3.2.0</mybatise.version>
013 <mybatis.spring>1.2.0</mybatis.spring>
014 <log4j.version>1.2.17</log4j.version>
015 <junit.version>4.12</junit.version>
016 <cglib.version>3.2.4</cglib.version>
017</properties>
018<dependencies>
019 <dependency>
020 <groupId>org.mybatis</groupId>
021 <artifactId>mybatis</artifactId>
022 <version>${mybatise.version}</version>
023 </dependency>
024 <dependency>
025 <groupId>org.mybatis</groupId>
026 <artifactId>mybatis-spring</artifactId>
027 <version>${mybatis.spring}</version>
028 </dependency>
029 <dependency>
030 <groupId>com.atomikos</groupId>
031 <artifactId>atomikos-util</artifactId>
032 <version>${atomikos.version}</version>
033 </dependency>
034 <dependency>
035 <groupId>com.atomikos</groupId>
036 <artifactId>transactions</artifactId>
037 <version>${atomikos.version}</version>
038 </dependency>
039 <dependency>
040 <groupId>com.atomikos</groupId>
041 <artifactId>transactions-jta</artifactId>
042 <version>${atomikos.version}</version>
043 </dependency>
044 <dependency>
045 <groupId>com.atomikos</groupId>
046 <artifactId>transactions-jdbc</artifactId>
047 <version>${atomikos.version}</version>
048 </dependency>
049 <dependency>
050 <groupId>com.atomikos</groupId>
051 <artifactId>transactions-api</artifactId>
052 <version>${atomikos.version}</version>
053 </dependency>
054 <dependency>
055 <groupId>javax.transaction</groupId>
056 <artifactId>jta</artifactId>
057 <version>${jta.version}</version>
058 </dependency>
059 <dependency>
060 <groupId>cglib</groupId>
061 <artifactId>cglib-nodep</artifactId>
062 <version>${cglib.version}</version>
063 </dependency>
064 <dependency>
065 <groupId>org.springframework</groupId>
066 <artifactId>spring-test</artifactId>
067 <version>${spring.version}</version>
068 </dependency>
069 <dependency>
070 <groupId>org.springframework</groupId>
071 <artifactId>spring-web</artifactId>
072 <version>${spring.version}</version>
073 </dependency>
074 <dependency>
075 <groupId>org.springframework</groupId>
076 <artifactId>spring-tx</artifactId>
077 <version>${spring.version}</version>
078 </dependency>
079 <dependency>
080 <groupId>org.springframework</groupId>
081 <artifactId>spring-beans</artifactId>
082 <version>${spring.version}</version>
083 </dependency>
084 <dependency>
085 <groupId>org.springframework</groupId>
086 <artifactId>spring-jdbc</artifactId>
087 <version>${spring.version}</version>
088 </dependency>
089 <dependency>
090 <groupId>org.springframework</groupId>
091 <artifactId>spring-webmvc</artifactId>
092 <version>${spring.version}</version>
093 </dependency>
094 <dependency>
095 <groupId>org.springframework</groupId>
096 <artifactId>spring-orm</artifactId>
097 <version>${spring.version}</version>
098 </dependency>
099 <dependency>
100 <groupId>org.springframework</groupId>
101 <artifactId>spring-context-support</artifactId>
102 <version>${spring.version}</version>
103 </dependency>
104 <!-- Spring Aop依賴jar -->
105 <dependency>
106 <groupId>org.aspectj</groupId>
107 <artifactId>aspectjweaver</artifactId>
108 <version>${aspectjweaver.version}</version>
109 </dependency>
110 
111 <dependency>
112 <groupId>aspectj</groupId>
113 <artifactId>aspectjrt</artifactId>
114 <version>${aspectjrt.version}</version>
115 </dependency>
116 <!-- CGLIB -->
117 <dependency>
118 <groupId>cglib</groupId>
119 <artifactId>cglib</artifactId>
120 <version>${cglib.version}</version>
121 </dependency>
122 <dependency>
123 <groupId>mysql</groupId>
124 <artifactId>mysql-connector-java</artifactId>
125 <version>${mysql.version}</version>
126 </dependency>
127 <dependency>
128 <groupId>com.alibaba</groupId>
129 <artifactId>druid</artifactId>
130 <version>${druid.version}</version>
131 </dependency>
132 <dependency>
133 <groupId>junit</groupId>
134 <artifactId>junit</artifactId>
135 <version>${junit.version}</version>
136 <scopte>test</scope>
137 </dependency>
138</dependencies>

spring-application-context.xml

01<?xml version="1.0" encoding="UTF-8"?>
19   
20   <!-- 1. 數據源配置 -->
21  <context:property-placeholder location="classpath*:*.properties" file-encoding="utf8" />
22 <bean id="utf8" class="java.lang.String">
23 <constructor-arg value="utf-8"></constructor-arg>
24 </bean>
25  <!-- 開啟異步任務(同時開啟定時器注解掃描) -->
26  <task:annotation-driven />
27  <!-- 使用@AspectJ風格的切面聲明 -->
28  <!-- <aop:aspectj-autoproxy/> -->
29  <!-- 使用Annotation自動注冊Bean -->
30  <!-- 在主容器中不掃描@Controller注解,在SpringMvc中只掃描@Controller注解 -->
31  <context:component-scan base-package="net.xiake6"><!-- base-package 如果多個,用“,”分隔 -->
32    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
33  </context:component-scan>
34  <!-- 引入Mybatis配置 -->
35  <!-- <import resource="spring-mybatis-atomikos-druid.xml"/> -->
36  <import resource="spring-mybatis-atomikos-druid.xml"/>
37</beans>

spring-mybatis-atomikos-druid.xml

001<?xml version="1.0" encoding="UTF-8"?>
018  default-lazy-init="true"
019 
020 <context:annotation-config />
021 <!-- 使用Druid使為XA數據源 -->
022  <bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" abstract="true">
023    <property name="xaDataSourceClassName" value="com.alibaba.druid.pool.xa.DruidXADataSource"/>
024    <property name="xaProperties">
025      <props>
026       <prop key="driverClassName">${jdbc.driverClassName}</prop>
027       <!-- 配置初始化大小、最小、最大 -->
028  <prop key="initialSize">10</prop>
029  <prop key="minIdle">3</prop>
030  <prop key="maxActive">100</prop>
031  <!-- 配置獲取連接等待超時的時間 -->
032  <prop key="maxWait">60000</prop>
033  <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
034  <prop key="timeBetweenEvictionRunsMillis">60000</prop>
035  <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
036  <prop key="minEvictableIdleTimeMillis">300000</prop>
037  <prop key="validationQuery">SELECT 'x'</prop>
038  <prop key="testWhileIdle">true</prop>
039  <prop key="testOnBorrow">false</prop>
040  <prop key="testOnReturn">false</prop>
041  <!-- 配置監控統計攔截的filters -->
042  <prop key="filters">stat</prop>
043      </props>
044    </property>
045  </bean>
046  <!-- 配置數據源一 -->
047  <bean id="dataSourceOne" parent="abstractXADataSource">
048    <property name="uniqueResourceName">
049      <value>dataSourceOne</value>
050    </property>
051    <property name="xaProperties">
052      <props>
053        <prop key="url">${jdbc.url}</prop>
054        <prop key="username">${jdbc.username}</prop>
055        <prop key="password">${jdbc.password}</prop>
056      </props>
057    </property>
058  </bean>
059  <!--配置數據源二-->
060  <bean id="dataSourceTwo" parent="abstractXADataSource">
061    <property name="uniqueResourceName">
062      <value>dataSourceTwo</value>
063    </property>
064    <property name="xaProperties">
065      <props>
066        <prop key="url">${jdbc.two.url}</prop>
067        <prop key="username">${jdbc.two.username}</prop>
068        <prop key="password">${jdbc.two.password}</prop>
069      </props>
070    </property>
071  </bean>
072   
073  <!--mybatis的相關配置-->
074  <bean id="sqlSessionFactoryOne" class="org.mybatis.spring.SqlSessionFactoryBean">
075    <property name="dataSource" ref="dataSourceOne"/>
076    <property name="mapperLocations" value="classpath*:mapping/ds1/*.xml"/>
077  </bean>
078   
079  <bean id="sqlSessionFactoryTwo" class="org.mybatis.spring.SqlSessionFactoryBean">
080    <property name="dataSource" ref="dataSourceTwo"/>
081    <property name="mapperLocations" value="classpath*:mapping/ds2/*.xml"/>
082  </bean>
083   
084  <!--配置mybatis映射文件自動掃描-->
085  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
086    <property name="basePackage" value="net.xiake6.dao.ds1"/>
087    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryOne"/>
088  </bean>
089 
090  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
091    <property name="basePackage" value="net.xiake6.dao.ds2"/>
092    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryTwo"/>
093  </bean>
094 
095  <!--配置分布式事務-->
096  <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
097    <property name="forceShutdown" value="false"/>
098  </bean>
099  <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
100    <property name="transactionTimeout" value="3000"/>
101  </bean>
102  <!--JTA事務管理器-->
103  <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
104    <property name="transactionManager">
105      <ref bean="atomikosTransactionManager"/>
106    </property>
107    <property name="userTransaction">
108      <ref bean="atomikosUserTransaction"/>
109    </property>
110    <property name="allowCustomIsolationLevels" value="true"/>
111  </bean>
112   
113   
114  <aop:config proxy-target-class="true">
115    <aop:advisor pointcut="execution(* *net.xiake6.service..*(..))" advice-ref="txAdvice" />
116  </aop:config>
117  <tx:advice id="txAdvice" transaction-manager="jtaTransactionManager">
118    <tx:attributes>
119      <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="*Exception"/>
120      <tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="*Exception" />
121      <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="*Exception" /> 
122      <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="*Exception" />
123      <tx:method name="del*" propagation="REQUIRED" read-only="false" rollback-for="*Exception" />
124      <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="*Exception" />
125      <tx:method name="select*" propagation="REQUIRED" read-only="true" />
126      <tx:method name="query" propagation="REQUIRED" read-only="true" />
127    </tx:attributes>
128  </tx:advice>
129   
130  <!-- 配置事務管理 -->
131  <tx:annotation-driven transaction-manager="jtaTransactionManager" />
132</beans>

jdbc.properties

jta.properties

1com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
2com.atomikos.icatch.console_file_name=tm.release.out
3com.atomikos.icatch.log_base_name=tm.releaselog
4com.atomikos.icatch.tm_unique_name=com.atomikos.spring.jdbc.tm.release
5com.atomikos.icatch.console_log_level=INFO

TestInsert.java

01@ContextConfiguration(value = {"classpath:spring-application-context.xml"})
02@RunWith(SpringJUnit4ClassRunner.class)
03public class TestInsert {
04 private Logger logger = LoggerFactory.getLogger(TestInsert.class);
05 @Autowired
06 private BatchInsertService batchInsertService;
07 
08 @Test
09 public void insert(){
10  
11 long startTime = System.currentTimeMillis();
12 User user = new User();
13 user.setName("User_"+(int)(Math.random()*100));
14 user.setAge((int)(Math.random()*100));
15  
16 CustInfo info = new CustInfo();
17 info.setPhone("123456789"+(int)(Math.random()*100));
18 batchInsertService.insert(user,info);
19  
20 long endTime = System.currentTimeMillis();
21 logger.info("共耗時:{}毫秒",endTime -startTime);
22 }
23}

BatchInsertService.java

01@Service
02public class BatchInsertService {
03 private Logger logger = LoggerFactory.getLogger(BatchInsertService.class);
04 @Autowired
05 private UserService userService;
06 @Autowired
07 private CustInfoService custInfoService;
08 @Transactional(rollbackFor= {Exception.class,RuntimeException.class})
09 public void insert(User user,CustInfo custInfo) {
10 int insertUser = userService.insert(user);
11 logger.info("insertUser={}",insertUser);
12 int insertCustInfo = custInfoService.insert(custInfo);
13 logger.info("insertCustInfo={}",insertCustInfo);
14 }
15}

UserService.java

01@Service
02public class UserService {
03 @Autowired
04 private UserMapper userMapper;
05  
06 public int insert(User record) {
07 int result = userMapper.insert(record);
08 return result;
09 }
10  
11}

CustInfoService.java

01@Service
02public class CustInfoService {
03 @Autowired
04 private CustInfoMapper custInfoMapper;
05 
06 public int insert(CustInfo record) {
07 int result = custInfoMapper.insert(record);
08 long now = System.currentTimeMillis();
09 // 模擬一個異常
10 if (now % 2 == 0) {
11  throw new RuntimeException("CustInfoMapper throws test insert exception");
12 }
13 return result;
14 }
15}

Mapper和Bean等就不列出來了,完成的示例工程在github: https://github.com/fenglibin/DruidWithAtomikos

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
519
主站蜘蛛池模板: 色爽| 久久国产精品一区二区三区 | 日韩欧美中文 | 日本三级中文在线电影 | eeuss国产一区二区三区四区 | 欧美日韩日本国产 | 视频一区二区三区中文字幕 | 粉色在线观看 | 成人在线看片 | 久草天堂 | 黄色免费网站观看 | www.久久精品 | 日本一区二区高清不卡 | 交视频在线观看国产 | 亚洲成人精品 | 久久日韩 | 欧美一区二区三区在线视频 | 国产精品久久精品 | 亚州中文字幕 | 久久久在线 | 久久成人国产精品 | 亚洲成人av一区二区 | 依人在线免费视频 | 成人黄色在线观看 | 国产精品久久久久久久久久久久久 | 欧美成人a∨高清免费观看 国产99久久 | 99久久婷婷国产综合精品电影 | 成人狠狠干 | 日韩欧美三区 | 五月婷婷精品 | 天天草视频 | 亚洲一区二区三区免费观看 | 日韩欧美国产一区二区三区 | 亚洲精品视频大全 | 日本激情网 | 国内成人免费视频 | 亚洲片国产一区一级在线观看 | 国产一区二区精品久久 | 欧美精品在线视频 | 日韩中文字幕免费视频 | 久久五月视频 |