博客
关于我
spring笔记(三)
阅读量:465 次
发布时间:2019-03-06

本文共 2192 字,大约阅读时间需要 7 分钟。

Spring事务控制详解

1.程序中事务控制

在应用程序中,事务控制是确保数据库操作的原子性、一致性、隔离性和持久性的关键环节。Spring框架通过声明式事务管理提供了简便的解决方案,能够有效实现事务控制。

1.1 环境准备

一个典型的Spring应用程序架构如下:用户访问 → Action → Service → Dao

在业务逻辑执行过程中,事务控制应在Service层统一管理。这是因为:

  • 服务层的每个方法调用代表一个业务操作
  • 所有涉及的DAO操作必须在同一个事务中执行
  • 如果某个DAO操作失败,整个事务需要回滚

模拟案例:在Service层调用两个DAO方法,要求如果其中一个方法抛出异常,整个操作必须回滚。

1.2 事务控制概述

编程式事务控制

手动控制事务的实现方式,通常需要在代码中显式地开启、提交和回滚事务。例如:

  • JDBC: Conn.setAutoCommit(false)
  • Hibernate: Session.beginTransaction()

这种方式灵活,但开发和维护成本较高,因为需要对每个需要事务控制的方法进行详细配置。

声明式事务控制

Spring提供了基于AOP的声明式事务管理,实现了对事务控制的最大程度的解耦。开发者只需在配置文件中配置事务管理方式,就可以实现事务控制,而无需手动编写事务相关代码。

1.3 事务管理器类

Spring支持两种主要的事务管理器:

  • DataSourceTransactionManager:基于JDBC的事务管理
  • HibernateTransactionManager:基于Hibernate的事务管理

2.声明式事务管理

2.1 XML配置方式

为了实现声明式事务管理,需要在Spring的配置文件中进行如下配置:

  • 引入Spring AOP相关jar包
  • 在bean.xml中配置事务管理器类
  • 配置事务增强(拦截需要事务控制的方法)
  • 核心配置示例:

    2.2 注解方式实现

    使用注解方式配置事务管理更加简便,只需在需要事务控制的方法上添加@Transactional注解。@Transactional可用于方法或类级别,具体配置如下:

    • @Transactional(readOnly=false, timeout=-1, noRollbackFor=ArithmeticException.class)

    注解配置示例:

    @Servicepublic class DeptService {    @Resource    private DeptDao deptDao;    @Transactional    public void save(Dept dept) {        deptDao.save(dept);    }}

    2.3 事务传播行为

    @Transactional注解支持不同的传播行为:

    • Propagation.REQUIRED:当前方法必须在已有事务中执行
    • Propagation.REQUIRED_NEW:当前方法必须在新事务中执行

    示例:

    @Transactional(propagation = Propagation.REQUIRED)public void saveDept() {    insertLog();    saveDept();}

    3.Spring与Hibernate整合

    3.1 整合关键点

  • 将Hibernate的SessionFactory交给Spring管理
  • 交给Spring管理的事务控制
  • 配置示例:

    4.SSH整合

    4.1 整合需求

    • JSP页面显示员工信息(查询功能)

    4.2 整合步骤

  • 引入必要的SSH jar包
  • 配置Struts和Spring的整合
  • 配置Hibernate事务控制
  • 核心配置文件:

    4.3 开发流程

  • Entity/Dao/Service/Action层开发
  • 配置Hibernate映射文件
  • 配置Spring的事务管理
  • 通过以上配置,可以实现对Spring与Struts、Hibernate的高效整合,确保应用程序的高性能和可维护性。

    转载地址:http://lwayz.baihongyu.com/

    你可能感兴趣的文章
    Python scrapy 常见问题及解决 【遇到的坑】
    查看>>
    Python Seborn热图数据的动态更新
    查看>>
    Python Seborn绘制空白直方图
    查看>>
    Python Selenium - 获取href值
    查看>>
    Python Selenium实现自动化测试及Chrome驱动使用!
    查看>>
    Python Selenium搭建UI自动化测试框架
    查看>>
    Python Selenium模块详解
    查看>>
    Python selenium爬取影评生成词云图
    查看>>
    python selenium自动化测试报告
    查看>>
    Python selenium自动化测试框架实战 —— 登录测试案例
    查看>>
    Python Selenium设计模式 —— POM
    查看>>
    Python Serial:如何使用 read 或 readline 函数一次读取多个字符
    查看>>
    Python set([]) 如何检查两个对象是否相等?一个对象需要定义哪些方法来自定义它?
    查看>>
    Python setup.py:数据文件无法复制目录:不存在或不是常规文件
    查看>>
    Python setuptools sdist:仅安装版本化文件
    查看>>
    Python Shell下使用matplotlib
    查看>>
    Python Slice How-to,我知道Python Slice,但我怎么才能使用内置的Slice对象呢?
    查看>>
    python socket分包发送数据
    查看>>
    python socket模块_Python socket模块实现TCP服务端客户端
    查看>>
    Python SOCKS5代理客户端HTTPS
    查看>>