A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区 黑马粉丝团   /  2019-6-5 14:04  /  1175 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天大家整理一下Spring的声明式事务,包括xml和注解

4 个回复

倒序浏览
基于xml的声明式事务控制:
        xml配置:
                导入约束;
                配置业务层和持久层的bean对象,并注入数据源;
                配置数据源;
                配置事务管理器:
                        tx:advice标签:设置DataSourceTransactionManager的bean对象;
                                id属性:事务管理器的标识
                                class属性:DataSourceTransactionManager的包路径;
                                property标签:注入数据源;
                配置事务通知和属性:
                        tx:advice标签:开始事务通知的配置;
                                id属性:事务通知的标识;
                                transaction-manager属性:事务管理器;
                                tx:method标签:开始配置事务的属性
                                        name属性:service层里需要增强的方法;
                                        propagation属性:指定传播行为(默认值是REQUIRED);
                                        isolation属性:指定隔离级别(默认值是DEFAULT);
                                        read-only属性:指定事务是否只读(默认值是false);
                                        timeout属性:指定超时时间(默认-1);
                                        ollback-for属性:指定异常,除该异常都不回滚(默认都回滚);
                                        no-rollback-for属性:指定异常,除该异常都回滚(默认都回滚);

                配置切入点:
                        aop:pointcut标签:定义切入点
                                id属性:切入点的标识;
                                expression属性:切入点的表达式;
                                aop:advisor标签:关联事务的通知和切入点;
                                        advice-ref属性:事务通知的标识;
                                        pointcut-ref属性:切入点的标识;
        持久层的实现类:
                        继承JdbcDaoSupport;
                        用JdbcDaoSupport的getJdbcTemplate()方法来执行SQL语句;
        注:该方式配置较繁琐,但使用(一次配置终生有效)方便;


基于注解的声明式事务控制:
        xml配置:
                导入约束;
                配置包扫描;
                配置JdbcTemplate的bean对象,并注入数据源信息;
                配置数据源;
                配置事务管理器:
                        tx:advice标签:设置DataSourceTransactionManager的bean对象;
                                id属性:事务管理器的标识
                                class属性:DataSourceTransactionManager的包路径;
                                property标签:注入数据源;
                开启spring对事务注解的支持:
                        tx:annotation-driven标签:开启注解支持;
                                transaction-manager属性:事务管理器
        业务层实现类:
                @Service注解:获取业务层的bean对象;
                @Transactional注解:配置事务的属性
                        propagation属性:指定事务;
                        readOnly属性:指定是否只读;
                        ...(如果各方法的事务属性不同,需要单独配置)
        持久层实现类:
                @Repository注解:获取持久层的bean对象;
                @Autowired注解:定义变量JdbcTemplate 进行自动类型注入;
        注:该方式配置方便,使用(事务的属性配置)较繁琐;
回复 使用道具 举报
Spring的声明式事务,包括xml和注解:
xml方式:
1、配置事务管理器对象:DataSourceTransactionManager
2、配置事务的通知
        此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的
        使用tx:advice标签配置事务通知
                属性:
                id:给事务通知起一个唯一标识
                transaction-manager:给事务通知提供一个事务管理器引用
3、配置AOP中的通用切入点表达式
4、建立事务通知和切入点表达式的对应关系<aop:advisor>标签
5、配置事务的属性
        是在事务的通知tx:advice标签的内部<tx:method>标签
注解方式:
1.xml配置事务管理器并注入数据源;
2.在业务层使用@Transational 注解;
        @Rransactional (readOnly=true/false, propagation=Propagation. SUPPORTS/...)
3.在配置文件中开启spring 对注解事务的支持;
        <!--开启spring对注解事务的支持-->
        <tx:annotation-driven transaction-manager="transactionManager"/>
回复 使用道具 举报
陈鹏涛
1.基于xml的spring的声明说事务流程:
         导入约束
         1.配置service层的对象:<bena id ='accountService' class="...."/>
         2.配置dao层的对象: <bena id ='accounDao' class="...."/>
         3.配置数据源
<bean id ='dataSource'        
             class='org.springframework.jdbc.datasource.DriverManagerDataSource'>
<property name=driver...
                 ........url....
           .      ....  username...
                   .... password...
  </bena>
          4.配置事务管理器
<bean id="transactionManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
         5.配置事务通知
tx:advice id="teDriver" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" read-only="false"/>
        <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
</tx:advice>
         6.配置AOP
2.基于注解
        配置spring对象烧苗包路径下所有注解...
        配置事务管理器....
        配置事务开启...1.基于xml的spring的声明说事务流程:
         导入约束
         1.配置service层的对象:<bena id ='accountService' class="...."/>
         2.配置dao层的对象: <bena id ='accounDao' class="...."/>
         3.配置数据源
<bean id ='dataSource'        
             class='org.springframework.jdbc.datasource.DriverManagerDataSource'>
<property name=driver...
                 ........url....
           .      ....  username...
                   .... password...
  </bena>
          4.配置事务管理器
<bean id="transactionManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
         5.配置事务通知
tx:advice id="teDriver" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" read-only="false"/>
        <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
</tx:advice>
         6.配置AOP
2.基于注解
        配置spring对象烧苗包路径下所有注解...
        配置事务管理器....
        配置事务开启...
回复 使用道具 举报
今天大家整理一下Spring的声明式事务,包括xml和注解
xml:
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

    <!-- 配置aop-->
    <aop:config>
        <!-- 配置切入点表达式-->
        <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl..(..))">/aop:pointcut
        <!--建立切入点表达式和事务通知的对应关系 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>

注解:
<!-- xml配置文件中开启spring对注解事务的支持-->
<tx:annotation-driven transaction-manager="transactionManager">/tx:annotation-driven

@Service("accountService")
@Transactional(propagation= Propagation.SUPPORTS,readOnly=true)//只读型事务的配置
public class AccountServiceImpl implements IAccountService{
        @Autowired
            private IAccountDao accountDao;

        //需要的是读写型事务配置
    @Transactional(propagation= Propagation.REQUIRED,readOnly=false)
    @Override
    public void transfer(String sourceName, String targetName, Float money) {   
            Account source = accountDao.findAccountByName(sourceName);
            Account target = accountDao.findAccountByName(targetName);         
            source.setMoney(source.getMoney()-money);         
            target.setMoney(target.getMoney()+money);            
            accountDao.updateAccount(source);
            accountDao.updateAccount(target);

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马