旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

spring事件断绝级别、流传行动以及spring+mybatis+atomikos完成分布式事件管理【MySQL教程】,spring,mysql

作者:搜教程发布时间:2019-11-27分类:MySQL教程浏览:80评论:0


导读:本篇文章给人人带来的内容是关于spring事件断绝级别、流传行动以及spring+mybatis+atomikos完成分布式事件治理,有肯定的参考价值,有须要的朋侪能够参考一下,愿...

本篇文章给人人带来的内容是关于spring事件断绝级别、流传行动以及spring+mybatis+atomikos完成分布式事件治理,有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。

1.事件的定义:事件是指多个操纵单位构成的合集,多个单位操纵是团体不可分割的,要么都操纵不胜利,要么都胜利。其必需遵照四个准绳(ACID)。

  1. 原子性(Atomicity):即事件是不可分割的最小事情单位,事件内的操纵要么全做,要么全不做;

  2. 一致性(Consistency):在事件实行前数据库的数据处于准确的状况,而事件实行完成后数据库的数据照样应当处于准确的状况,即数据完全性束缚没有被损坏;如银行转帐,A转帐给B,必需保证A的钱肯定转给B,肯定不会涌现A的钱转了但B没收到,不然数据库的数据就处于不一致(不准确)的状况。

  3. 断绝性(Isolation):并发事件实行之间互不影响,在一个事件内部的操纵对其他事件是不产生影响,这须要事件断绝级别来指定断绝性;

  4. 持久性(Durability):事件一旦实行胜利,它对数据库的数据的转变必需是永远的,不会因比方碰到系统故障或断电形成数据不一致或丧失。

2.事件的范例

  1. 数据库分为当地事件跟全局事件

    • 当地事件:平常事件,自力一个数据库,能保证在该数据库上操纵的ACID。

    • 分布式事件:触及两个或多个数据库源的事件,即逾越多台同类或异类数据库的事件(由每台数据库的当地事件构成的),分布式事件旨在保证这些当地事件的一切操纵的ACID,使事件能够逾越多台数据库;

  2. Java事件范例分为JDBC事件跟JTA事件

    • JDBC事件:即为上面说的数据库事件中的当地事件,经由过程connection对象掌握治理。

    • JTA事件:JTA指Java事件API(Java Transaction API),是Java EE数据库事件范例, JTA只供应了事件治理接口,由应用顺序服务器厂商(如WebSphere Application Server)供应完成,JTA事件比JDBC更壮大,支撑分布式事件

  3. 按是不是经由过程编程分为声明式事件和编程式事件,参考http://blog.csdn.net/liaohaojian/article/details/70139151

    • 声明式事件:经由过程XML设置或许注解完成。

    • 编程式事件:经由过程编程代码在营业逻辑时须要时自行完成,粒度更小。

3.Spring事件断绝级别:spring有五大断绝级别,其在TransactionDefinition接口中定义。看源码可知,其默isolation_default(底层数据库默许级别),其他四个断绝级别跟数据库断绝级别一致。

  1. ISOLATION_DEFAULT:用底层数据库的默许断绝级别,数据库治理员设置什么就是什么

  2. ISOLATION_READ_UNCOMMITTED(未提交读):最低断绝级别、事件未提交前,就可被其他事件读取(会涌现幻读、脏读、不可反复读)

  3. ISOLATION_READ_COMMITTED(提交读):一个事件提交后才被其他事件读取到(该断绝级别制止其他事件读取到未提交事件的数据、所以照样会形成幻读、不可反复读)、sql server默许级别

  4. ISOLATION_REPEATABLE_READ(可反复读):可反复读,保证屡次读取统一个数据时,其值都和事件最先时刻的内容是一致,制止读取到别的事件未提交的数据(该断绝基础可防备脏读,不可反复读(重点在修正),但会涌现幻读(重点在增添与删除))(MySql默许级别,变动可经由过程set transaction isolation level 级别

  5. ISOLATION_SERIALIZABLE(序列化):价值最高最牢靠的断绝级别(该断绝级别能防备脏读、不可反复读、幻读)

    1. 丧失更新:两个事件同时更新一行数据,末了一个事件的更新会覆盖掉第一个事件的更新,从而致使第一个事件更新的数据丧失,这是因为没有加锁形成的;

    2. 幻读:一样的事件操纵过程当中,差别时候段屡次(差别事件)读取统一数据,读取到的内容不一致(平常是行数变多或变少)。

    3. 脏读:一个事件读取到别的一个未说起事件的内容,即为脏读。

    4. 不可反复读:统一事件中,屡次读取内容不一致(平常行数稳定,而内容变了)。

幻读与不可反复读的区分:幻读的重点在于插进去与删除,即第二次查询会发明比第一次查询数据变少或许变多了,以至于给人一种幻象一样,而不可反复读重点在于修正,即第二次查询会发明查询效果比第一次查询效果不一致,即第一次效果已不可重现了。

数据库断绝级别越高,实行价值越高,并发实行才能越差,因此在现实项目开辟运用时要综合斟酌,为了斟酌并发机能平常运用提交读断绝级别,它能防止丧失更新和脏读,只管不可反复读和幻读不能防止,但能够在能够涌现的场所运用消极锁或乐观锁来处置惩罚这些题目。

4.流传行动:有七大流传行动,也是在TransactionDefinition接口中定义。

  1. PROPAGATION_REQUIRED:支撑当前事件,如当前没有事件,则新建一个。

  2. PROPAGATION_SUPPORTS:支撑当前事件,如当前没有事件,则已非事件性实行(源码中提醒有个注重点,看不太邃晓,留待背面精细精美)。

  3. PROPAGATION_MANDATORY:支撑当前事件,如当前没有事件,则抛出非常(强迫肯定要在一个已存在的事件中实行,营业要领不可单独提议本身的事件)。

  4. PROPAGATION_REQUIRES_NEW:一直新建一个事件,如当前本来有事件,则把原事件挂起。

  5. PROPAGATION_NOT_SUPPORTED:不支撑当前事件,一直已非事件性体式格局实行,如当前事件存在,挂起该事件。

  6. PROPAGATION_NEVER:不支撑当前事件;假如当前事件存在,则激发非常。

  7. PROPAGATION_NESTED:假如当前事件存在,则在嵌套事件中实行,假如当前没有事件,则实行与 PROPAGATION_REQUIRED 相似的操纵(注重:当应用到JDBC时,只实用JDBC 3.0以上驱动)。

5.Spring事件支撑

1.spring供应了许多内置事件治理器,支撑差别数据源。罕见的有三大类

  • DataSourceTransactionManager:org.springframework.jdbc.datasource包下,数据源事件治理类,供应对单个javax.sql.DataSource数据源的事件治理,只需用于JDBC,Mybatis框架事件治理。

  • HibernateTransactionManager:org.springframework.orm.hibernate3包下,数据源事件治理类,供应对单个org.hibernate.SessionFactory事件支撑,用于集成Hibernate框架时的事件治理;注重:该事件治理器只支撑Hibernate3+版本,且Spring3.0+版本只支撑Hibernate 3.2+版本;

  • JtaTransactionManager:位于org.springframework.transaction.jta包中,供应对分布式事件治理的支撑,并将事件治理托付给Java EE应用服务器,或许自定义一个当地JTA事件治理器,嵌套到应用顺序中。

内置事件治理器都继续了笼统类AbstractPlatformTransactionManager,而AbstractPlatformTransactionManager又继续了接口PlatformTransactionManager

Spring框架支撑事件治理的中心是事件治理器笼统,关于差别的数据接见框架经由过程完成战略接口PlatformTransactionManager,从而能支撑多钟数据接见框架的事件治理。

PlatformTransactionManager接口定义以下

TransactionStatus接口定义以下:
public interface TransactionStatus extends SavepointManager {  
       boolean isNewTransaction();  //返回当前事件是不是是新的事件
       boolean hasSavepoint();  //返回当前事件是不是有保存点
       void setRollbackOnly();  //设置事件回滚
       boolean isRollbackOnly();  //设置当前事件是不是应当回滚
       void flush();  //用于革新底层会话中的修正到数据库,平常用于革新如Hibernate/JPA的会话,能够对如JDBC范例的事件无任何影响;
       boolean isCompleted();  //返回事件是不是完成
}

2.Spring分布式事件设置

  • 援用应用服务器(如Tomcat)的JNDI数据源,间接完成JTA事件治理,依赖于应用服务器

  • 直接集成JOTM(官网:http://jotm.objectweb.org/)、Atomikos(官网:https://www.atomikos.com/)供应JTA事件治理(无应用服务器支撑,常用于单位测试)

  • 运用特定于应用服务器的事件治理器,运用JTA事件的高等功用(Weblogic,Websphere)

1).援用应用服务器(如Tomcat)的JNDI数据源,间接完成JTA事件治理,设置以下

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/jee
       http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
 <!-- JNDI数据源 -->
  <jee:jndi-lookup id="dataSource" jndi-name="jdbc/test"/>
    <!-- JTA事件治理器  -->
  	<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
  		<!--transactionManagerName指定JTA事件治理器的JNDI名字,从而将事件治理托付给该事件治理器  -->
    	<property name="transactionManagerName" value="java:comp/TransactionManager"/>
  	</bean>
</beans>

2)运用Atomikos完成分布式事件治理,设置以下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"	
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/task
	http://www.springframework.org/schema/task/spring-task-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
	>  
	<context:component-scan base-package="com.suicai.*.service.impl" />
	<context:component-scan base-package="com.suicai.util" />
    <!-- 此要领加载的设置文件仅仅在xml中运用,然则东西类都采纳注解的体式格局 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:conn.properties" />
	</bean>
	<!-- 仅仅支撑注解不支撑在xml设置中运用properties文件  在类中能够运用SPEL表达式来加载响应的值 -->
	<bean id="temp" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="locations">
			<array>
				<value>classpath:public.properties</value>
			</array>
		</property>
	</bean>
	<bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"  destroy-method="close" abstract="true"> 
        <property name="borrowConnectionTimeout" value="60"/>  <!--猎取衔接失利从新获守候最大时候,在这个时候内假若有可用衔接,将返回-->
        <property name="reapTimeout" value="20"/> <!--最大猎取数据时候,假如不设置这个值,Atomikos运用默许的5分钟,那末在处置惩罚大批量数据读取的时刻,一旦凌驾5分钟,就会抛出相似 Resultset is close 的毛病.-->        
        <property name="maintenanceInterval" value="60" />  <!--衔接接纳时候-->    
        <property name="loginTimeout" value="60" />     <!--java数据库衔接池,最大可守候猎取datasouce的时候-->
        <property name="logWriter" value="60"/>
        <property name="minPoolSize" value="1" />  <!-- 衔接池中保存的最小衔接数   -->
        <property name="maxPoolSize" value="3" />  <!-- 衔接池中保存的最大衔接数    -->
        <property name="maxIdleTime" value="60" /> <!-- 最大余暇时候,60秒内未运用则衔接被抛弃。若为0则永不抛弃。Default: 0 -->
    </bean> 
     <!-- 设置2个数据源 mysql -->
     <bean id="ds_suicai" parent="abstractXADataSource">  
     	<!-- uniqueResourceName示意唯一资本名,若有多个数据源不可反复; -->
     	<property name="uniqueResourceName" value="suicaifortest" />
     	<!--  xaDataSourceClassName是细致分布式数据源厂商完成; -->
     	<property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
     	<!-- xaProperties属性指定细致厂商数据库属性 -->
     	<property name="xaProperties">
            <props>
                <prop key="URL">${db.jdbcUrlOne}</prop>
                <prop key="user">${user}</prop>
                <prop key="password">${password}</prop>
            </props>
        </property>
    </bean>  
	<bean id="ds_kaizhi"  parent="abstractXADataSource">  
		<!-- uniqueResourceName示意唯一资本名,若有多个数据源不可反复; -->
		<property name="uniqueResourceName" value="puildingpurchasefortest" />
		<!-- xaDataSourceClassName是细致分布式数据源厂商完成; -->
		<property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
		<!-- xaProperties属性指定细致厂商数据库属性 -->
		<property name="xaProperties">
            <props>
                <prop key="URL">${db.jdbcUrlTwo}</prop>
                <prop key="user">${user}</prop>
                <prop key="password">${password}</prop>
            </props>
        </property>
    </bean>  
    <!-- 动态设置数据源 --> 
    <bean id="dataSource2" class="com.suicai.common.datasource.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type ="java.lang.String">  
                <entry value-ref ="ds_suicai" key="ds_suicai"></entry >  
                <entry value-ref ="ds_kaizhi" key="ds_kaizhi"></entry >  
            </map > 
        </property>  
        <property name ="defaultTargetDataSource" ref="ds_suicai"></property>  
    </bean>
    <bean id ="sqlSessionFactoryBeanA" class="org.mybatis.spring.SqlSessionFactoryBean" >  
       <!-- 指定数据源 -->  
       <property name ="dataSource" ref="ds_suicai" />  
       <!-- 指定mybatis 的设置文件 -->  
       <property name ="configLocation" value="classpath:mybatis.cfg.xml" />  
	</bean>
	<bean id ="sqlSessionFactoryBeanB" class="org.mybatis.spring.SqlSessionFactoryBean" >  
       <!-- 指定数据源 -->  
       <property name ="dataSource" ref="ds_kaizhi" />  
       <!-- 指定mybatis 的设置文件 -->  
       <property name ="configLocation" value="classpath:mybatis.cfg.xml" />  
	</bean>
	<!--CustomSqlSessionTemplate继续SqlSessionTemplate重写getSqlSessionFactory要领,细致请下载检察--> 
	<bean id="sqlSessionTemplate" class="com.suicai.util.CustomSqlSessionTemplate" scope="prototype">
        <constructor-arg ref="sqlSessionFactoryBeanA" />
        <property name="targetSqlSessionFactorys">
            <map>     
                <entry value-ref ="sqlSessionFactoryBeanA" key="ds_suicai1"></entry >  
                <entry value-ref ="sqlSessionFactoryBeanB" key="ds_kaizhi1"></entry >  
            </map> 
        </property>
    </bean>  
	<!-- 设置atomikos事件治理器 -->
	<bean id="atomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method = "close">    
	      <property name="forceShutdown" value="true"/>    
	</bean>    
	<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"></bean>
	<!-- 设置spring事件治理器 -->
	<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">    
	    <property name="transactionManager">    
	        <ref bean="atomikosTransactionManager"/>    
	    </property>    
	    <property name="userTransaction">    
	        <ref bean="atomikosUserTransaction"/>    
	    </property> 
	    <!-- 必需设置,不然顺序涌现非常 JtaTransactionManager does not support custom isolation levels by default -->
	    <property name="allowCustomIsolationLevels" value="true"/>    
	</bean>
	<tx:advice id="advice" transaction-manager="transactionManager">
		<tx:attributes>
		    <!-- REQUIRED:必需要有事件, 假如没有就在上下文建立一个 -->
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="creat*" propagation="REQUIRED"/>
			<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
			<!-- 支撑,假若有就有,没有就没有 -->
			<tx:method name="*" propagation="SUPPORTS"/>
		</tx:attributes>
	</tx:advice>
	<aop:config>
	    <aop:pointcut expression="execution(* com.suicai.*.service.impl.*.*(..))" id="pointcut"/>
	    <!-- 吧 tx与aop的设置关联,才是完全的声明事件设置 -->
	    <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
	</aop:config>
	<!-- 采纳包扫描机制,自动会把指定的包内里的一切dao注册 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 注重注入sqlSessionTemplate -->
        <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
		<property name="basePackage" value="com.suicai.*.dao" />
	</bean>
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass">
			<value>org.springframework.web.servlet.view.InternalResourceView</value>
		</property>
		<!--jsp寄存的目次-->
		<property name="prefix">
			<value>/</value>
		</property>
		<!--jsp文件的后缀-->
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
	<!-- 验证码 -->
	<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
        <property name="config">  
            <bean class="com.google.code.kaptcha.util.Config">  
                <constructor-arg>  
                    <props>  
                        <prop key="kaptcha.border">no</prop>  
                        <prop key="kaptcha.border.color">105,179,90</prop>  
                        <prop key="kaptcha.textproducer.font.color">red</prop>  
                        <prop key="kaptcha.image.width">200</prop>  
                        <prop key="kaptcha.textproducer.font.size">60</prop>  
                        <prop key="kaptcha.image.height">80</prop>  
                        <prop key="kaptcha.session.key">code</prop>  
                        <prop key="kaptcha.textproducer.char.length">4</prop>  
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>  
                    </props>  
                </constructor-arg>  
            </bean>  
        </property>  
    </bean>
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:messages"/>  
        <property name="fileEncodings" value="utf-8"/>  
        <property name="cacheSeconds" value="120"/>  
	</bean>
</beans>

以上就是spring事件断绝级别、流传行动以及spring+mybatis+atomikos完成分布式事件治理的细致内容,更多请关注ki4网别的相干文章!

标签:springmysql


欢迎 发表评论: