博客
关于我
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/

    你可能感兴趣的文章
    poj1061 - 同余方程,二元一次不定方程
    查看>>
    Qt笔记——SQLite再探
    查看>>
    poj1068Parencodings
    查看>>
    poj1182(带权并查集)
    查看>>
    POJ1182(带权并查集)
    查看>>
    Qt笔记——Qt初探、PyQt5和Qt5
    查看>>
    poj1190生日蛋糕
    查看>>
    POJ1218 HDU1337 ZOJ1350 UVALive2557 THE DRUNK JAILER
    查看>>
    poj1222 EXTENDED LIGHTS OUT(gauss)
    查看>>
    POJ1240 m叉树
    查看>>
    Poj1328--Radar Installation(区间选点)
    查看>>
    POJ1384Piggy-Bank(DP)
    查看>>
    POJ1417 True Liars —— 并查集 + DP
    查看>>
    Poj1459 Power Network 预流推进
    查看>>
    POJ1502(MPI Maelstrom)
    查看>>
    poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]
    查看>>
    poj1730 - Perfect Pth Powers(完全平方数)(水题)
    查看>>
    poj1753——Flip Game
    查看>>
    poj1936 假期计划第一水
    查看>>
    poj1958-汉诺四塔问题(三种方法)
    查看>>