SSM配置事务的两种方式详解:Xml方式和注解方式

SSM配置事务的方式之Xml形式:

在applicationContext.xml文件中添加:

<!-- 事务控制
    不使用事务控制的时候,增删改也能进行,
    那可能是springmybatis整合之后,
    spring自动调用了mybatis底层的JDBC去处理事务,但这种处理事务是dao层的,也就是mapper层的
    我们真正需要的事务处理是service层的.service中某个业务调用dao层中多个方法时,要么同时成功,要么同时失败,
    这才是我们需要的事务控制-->

<!--控制事务的类-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>
<!--Xml方式配置事务-->
<!--具体有哪些增强的方法-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!--查询方法的事务-->
        <tx:method name="find*" read-only="true"/>
        <!--增删改方法的事务-->
        <tx:method name="*"/>
        <!--如果第一个满足条件,就不会走第二个,所以有顺序问题-->
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="txPointcut" expression="execution(* com.xiongluoluo.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

SSM配置事务的方式之注解形式:

1.在applicationContext.xml文件中添加:

<!-- 事务控制
    不使用事务控制的时候,增删改也能进行,
    那可能是springmybatis整合之后,
    spring自动调用了mybatis底层的JDBC去处理事务,但这种处理事务是dao层的,也就是mapper层的
    我们真正需要的事务处理是service层的.service中某个业务调用dao层中多个方法时,要么同时成功,要么同时失败,
    这才是我们需要的事务控制-->

<!--控制事务的类-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 注解形式配置事务的方式(直接在需要添加事务的方法写注解即可)-->
<!--增删改的注解 @Transactional(transactionManager = "transactionManager")-->
<!--查询的注解(由于查询不需要提交事务,可以设置为只读的,提高性能)
@Transactional(transactionManager = "transactionManager",readOnly = true)-->
<tx:annotation-driven/>

2.在需要事务处理的方法上添加注解(一般是service层的方法)

@Service
public class DepartmentServiceImpl implements DepartmentService {
    @Autowired
    private DepartmentMapper departmentMapper;
    /*这个报红没影响,因为mapper的创建对象方式跟别的对象不一样,认真理解一下*/
    @Override
    @Transactional(transactionManager = "transactionManager")
    public void saveDepartment(Department department) {
        departmentMapper.insertDepartment(department);
    }


    @Override
    @Transactional(transactionManager = "transactionManager")
    public void removeDepartment(Integer id) {
        departmentMapper.deleteDepartment(id);
    }


    @Override
    @Transactional(transactionManager = "transactionManager")
    public void editDepartment(Department department) {
        departmentMapper.updateDepartment(department);
    }

    @Override
    @Transactional(transactionManager = "transactionManager")
    public Department findDepartmentById(Integer id) {
        return departmentMapper.selectDepartmentById(id);
    }

    @Override
    @Transactional(transactionManager = "transactionManager",readOnly = true)
    public List<Department> findAllDepartment() {
        return departmentMapper.selectAllDepartment();
    }

    @Override
    @Transactional(transactionManager = "transactionManager",readOnly = true)
    public Department findDepartmentByNameAndPassword(String name, String password) {
        return departmentMapper.selectDepartmentByNameAndPassword(name,password);
    }
}

总结:

个人感觉事务处理还是用Xml形式比较好,一劳永逸,不然每个方法都得写,有点儿麻烦

发布了100 篇原创文章 · 获赞 7 · 访问量 7546

猜你喜欢

转载自blog.csdn.net/qq_40245464/article/details/103881119
今日推荐