SSM框架事务配置

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

   原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

   一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

   隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

   持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

配置事务管理

    <!-- 事务管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--  数据源 源自于mybatis,也就是看dao.xml-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

声明式事务

    <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

拦截器方式配置事物

    <!-- 通知事务系列方法 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--定义属性,声明事务规则 -->
        <tx:attributes>
            <!-- REQUIRED意思是如果当前事务不存在,就创建一个事务 -->
            <tx:method name="transfer*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="create*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="modify*" propagation="REQUIRED"/>
            <tx:method name="edit*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="drop*" propagation="REQUIRED"/>
            <tx:method name="pay*" propagation="REQUIRED"/>
            <!-- SUPPORTS意思是 如果当前没有事务存在,就以非事务的方式执行 -->
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="search*" propagation="SUPPORTS" read-only="true"/>

        </tx:attributes>
    </tx:advice>
       /**
	   注释:<tx:advice id="txAdvice"  transaction-manager="txManger">这个 transaction-manager必须是事务管理器的名字,下面的      是方法的开头 比如说 service层的方法保存是以save什么什么,那配置的时候就save* 就是以save开头的方法获取事务。
	*/

这个配置很重要,切面的切入位置

    <!-- 这个配置很重要,切面的切入位置-->
    //定义切面
   <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com..service..*.*(..))"/>
        <!-- 将事务增强与切入点组合(织入事务切面) -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>


具体使用那个方法:

service层也是运用的@Transactional注解,直接加在方法上,只对此方法生效
需要事物的具体操作需要try{}catch(){}



	@Transactional
	@Override
	public int insertProject(Project project) {
		int i,j;
		// TODO Auto-generated method stub
		try{
			i = numeralLoginDao.insertInToResellAll(project);//操作1
			j = numeralLoginDao.deleteTemporaryResell(project.getPhonenumber());//操作2
			if(i==0||j==0){
			throw new Exception();
			}

			}catch(Exception e){
			System.out.println("数据操作错误");
			}
		return null;
	}
	这样只要发生定义的和未知的错误都会回滚!

猜你喜欢

转载自blog.csdn.net/weixin_40725027/article/details/83186711