`

Spring JDBC事务管理

阅读更多

Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction management),为不同的事务实现提供了一致的编程模型,这节以JDBC事务为例,介绍Spring的事务管理。

    5.3.1 Spring对事务的支持

    事务是一组原子(Atomic)操作的工作单元,以数据库存取的实例来说,就是一组SQL指令,这一组SQL指令必须全部执行成功,若因为某个原因未全部执行成功(例如其中一行SQL有错误),则先前所有执行过的SQL指令都会被撤消。

    举个简单的例子,一个客户从A银行转账至B银行,要作的动作为从A银行的账户扣款、在B银行的账户加上转账的金额,两个动作必须成功,如果有一个动作失败,则此次转账失败。

    事务还必须保持所参与资源的一致性(Consistent),例如在银行账户的例子中,两个账户的转账金额,B账户取款的金额不能大于A账户的存款金额。 每个事务彼此之间必须是隔离的(Isolated),例如在A账户中可能有两笔事务,同时进行存款与提款的动作,两个事务基本上不需意识到彼此的存在。事 务还必须是可持续的(Durable),在某一笔事务之后,这笔事务必须是被记录下来的。

    在这里将介绍JDBC如何使用事务管理。首先来看看事务的原子性实现,在JDBC中,可以操作Connection的setAutoCommit() 方法,给定false参数,在下达一连串的SQL语句后,自行执行Connection的commit()来送出变更,如果中间发生错误,则执行 rollback() 来撤消所有的执行,例如:

try {
 
    .....
 
    connection.setAutoCommit(false);
 
    .....
 
    // 一连串SQL操作


    connection.commit();
 
} catch(SQLException) {
 
    // 发生错误,撤消所有变更


    connection.rollback();
 
}


    在Spring中对JDBC的事务管理加以封装,Spring事务管理的抽象关键在于org.springframework.transaction.PlatformTransactionManager接口的实现:

public interface PlatformTransactionManager {
 
    TransactionStatus getTransaction(TransactionDefinition
 
                    definition) throws TransactionException;
 
    void commit(TransactionStatus status)
 
                                   throws TransactionException;
 
    void rollback(TransactionStatus status)
 
                                   throws TransactionException;
 
}


    PlatformTransactionManager 接口有许多具体的事务实现类,例如DataSourceTransactionManager、 HibernateTransactionManager、JdoTransaction- Manager、JtaTransactionManager等,通过依赖于PlatformTransactionManager接口及各种的技术实 现,Spring在事务管理上可以让开发人员使用一致的编程模型,即使所使用的是不同的事务管理技术。

    TransactionException是Unchecked Exception.事务的失败通常都是致命的错误,Spring不强迫您一定要处理,而是让您自行选择是否要捕捉异常。

    getTransaction() 方法根据一个TransactionDefinition对象来回传一个TransactionStatus对 象,TransactionDefinition接口的实例定义了事务的隔离程度(Isolation level)、传播行为(Propagation behavior)、超时(Timeout)、只读(Read-only)等,TransactionStatus代表着一个新的事务发起或已经存在的事 务,您可以通过它来控制事务的执行或调查的状态:

public interface TransactionStatus {
 
    boolean isNewTransaction();
 
    void setRollbackOnly();
 
    boolean isRollbackOnly();
 
}

Spring提供编程式的事务管理(Programmatic transaction management)与声明式的事务管理(Declarative transaction management):

    l 编程式的事务管理

    编程式的事务管理可以清楚地控制事务的边界,也就是让您自行实现事务开始时间、撤消操作的时机、结束时间等,可以实现细粒度的事务控制。

    l 声明式的事务管理

    然而多数的情况下,事务并不需要细粒度的控制,而是采用声明式的事务管理,好处是Spring事务管理的相关API可以不用介入程序之中,从对象的角度来 看,它并不知道自己正被纳入事务管理之中,在不需要事务管理的时候,只要在设置文件上修改一下设置,即可移去事务管理服务。

    5.3.2 JDBC编程事务管理Spring提供两种方式实现编程式的事务管理,一是直接使用PlatformTransaction- Manager实现,二是使用org.springframework.transaction.support.Transaction- Template.

    先来看看如何使用PlatformTransactionManager,在这里使用它的实现类 DataSourceTransactionManager,可以改写一下之前5.2.1节中的JdbcTemplateDemo项目,让它具有事务管理 功能,修改一下UserDAO类的insert() 方法来作示范:ProgrammaticTransactionDemo UserDAO.java

package onlyfun.caterpillar;
 
import java.util.Iterator;
 
import java.util.List;
 
import java.util.Map;
 
import javax.sql.DataSource;
 
import org.springframework.dao.DataAccessException;
 
import org.springframework.jdbc.core.JdbcTemplate;
 
import org.springframework.jdbc.
 
            datasource.DataSourceTransactionManager;
 
import org.springframework.transaction.TransactionDefinition;
 
import org.springframework.transaction.TransactionStatus;
 
import org.springframework.transaction.
 
            support.DefaultTransactionDefinition;
 
public class UserDAO implements IUserDAO {
 
    private DataSourceTransactionManager transactionManager;
 
    private DefaultTransactionDefinition def;
 
    private JdbcTemplate jdbcTemplate;
 
      
 
    public void setDataSource(DataSource dataSource) {
 
        jdbcTemplate = new JdbcTemplate(dataSource);
 
        transactionManager =
 
            new DataSourceTransactionManager(dataSource);
 
        // 建立事务的定义


        def = new DefaultTransactionDefinition();
 
        def.setPropagationBehavior(
 
                TransactionDefinition.PROPAGATION_REQUIRED);
 
    }
 
      
 
    public void insert(User user) {
 
       String name = user.getName();
 
       int age = user.getAge().intValue();
 
         
 
       TransactionStatus status =
 
           transactionManager.getTransaction(def);
 
       try {
 
           jdbcTemplate.update("INSERT INTO user (name,age) "
 
                   + "VALUES('" + name + "'," + age + ")");
 
           // 下面的SQL有错误,用以测试事务


           jdbcTemplate.update("INSER INTO user (name,age) "
 
                   + "VALUES('" + name + "'," + age + ")");
 
       }
 
       catch(DataAccessException e) {
 
           transactionManager.rollback(status);
 
           throw e;
 
       }
 
       transactionManager.commit(status);
 
    }
 
    public User find(Integer id) {
 
        List rows = jdbcTemplate.queryForList(
 
          "SELECT * FROM user WHERE id=" + id.intValue());
 
          
 
        Iterator it = rows.iterator();
 
        if(it.hasNext()) {
 
            Map userMap = (Map) it.next();
 
            Integer i = new Integer(
 
                    userMap.get("id").toString());
 
            String name = userMap.get("name").toString();
 
            Integer age = new Integer(
 
                    userMap.get("age").toString());
 
            User user = new User();
 
              
 
            user.setId(i);
 
            user.setName(name);
 
            user.setAge(age);
 
              
 
            return user;
 
        }
 
        return null;
 
    }
 
}

分享到:
评论

相关推荐

    spring JDBC事务管理

    标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...

    实例详解Spring JDBC事务管理.doc

    Spring JDBC事务管理 Spring框架提供了两种事务管理方式:编程式的事务管理(Programmatic transaction management)和声明式的事务管理(Declarative transaction management)。在本文中,我们将以JDBC事务管理...

    spring hibernate,spring jdbc事务管理

    两个项目,一个项目是基于spring jdbc实现的分布式事务,一个是基于spring hibernate的分布式事务,hibernate项目里的applicationContext2.xml是基于mysql和mssql, applicationContext3.xml基于两个mssql, ...

    Spring JDBC与事务管理

    javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...

    spring jdbc 事务

    综上,Spring JDBC事务管理是Spring框架中重要的部分,通过理解并掌握其原理和使用方法,可以帮助开发者构建稳定、可靠的数据库应用程序。在实践中,要根据项目的具体需求选择合适的事务管理策略,并注意处理事务...

    Spring事务管理和SpringJDBC思维导图

    本话题主要关注Spring的两个重要模块:事务管理和Spring JDBC。这些知识点对于任何使用Spring进行后端开发的程序员来说都是至关重要的。 首先,我们来深入理解Spring事务管理。事务是数据库操作的基本单元,它确保...

    JavaEE的Spring JDBC与事务管理 实验

    3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二、 实验内容 1、在MySQL中创建以下三张表,其中account为账户表,book为书籍信息...

    spring-jdbc-dao

    四、Spring JDBC事务管理 1. 编程式事务管理:通过PlatformTransactionManager接口的begin(), commit()和rollback()方法手动控制事务。 2. 声明式事务管理:利用@Transactional注解在方法级别声明事务,Spring会自动...

    基于Spring JDBC的事务管理

    基于Spring JDBC的事务管理 本资源主要介绍基于Spring JDBC的事务管理,包括事务的定义、使用 @Transactional 注解、Spring JDBC的事务管理机制、事务的ACID特性、事务的传播、事务的隔离等内容。 事务的定义 ...

    spring_JDBC整合包

    在分布式环境下,Spring JDBC配合Spring的事务管理功能,可以实现跨数据库操作的事务一致性。 这个"spring_JDBC基本包"可能包含的文件有Spring框架的基础库,如spring-jdbc.jar,数据库驱动如mysql-connector-java....

    Spring JDBC与事务管理源代码

    1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用;...3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。

    Spring JDBC常用Jar包

    例如,通过Spring JDBC,你可以利用JdbcTemplate执行SQL查询、更新、插入和删除操作,同时利用Spring的事务管理能力来确保数据的一致性。此外,通过依赖注入,你可以将DataSource配置在外部,使得数据库配置的改变...

    spring jdbc.zip

    Spring JDBC不仅包含了JDBC的基本功能,如数据源配置、事务管理,还引入了模板模式,即JdbcTemplate,进一步降低了数据库操作的复杂性。 JdbcTemplate是Spring JDBC的核心类,它是对JDBC的简单而强大的封装。它提供...

    SpringJDBC注解事务.zip

    本篇文章将深入探讨Spring JDBC如何通过注解来实现事务管理。 1. **Spring JDBC简介** Spring JDBC提供了一个JdbcTemplate类,它封装了常见的JDBC操作,如执行SQL查询、更新、调用存储过程等,减少了代码量和出错...

    SpringJDBC.rar_SpringJDBC_spring jdbc

    通过这个SpringJDBC.rar的案例,初学者可以学习到如何配置DataSource,如何创建JdbcTemplate实例,以及如何编写和执行SQL语句。同时,实践中还可以了解到如何将Spring JDBC整合到Spring Boot项目中,以及如何处理...

    spring-jdbc jar包.rar

    4. **JdbcTransactionManager**:Spring JDBC提供了事务管理功能,JdbcTransactionManager是基于JDBC的事务管理器,它负责控制数据库事务的开始、提交、回滚等操作。 5. **DataSourceUtils** 和 **ConnectionUtils*...

    Spring Jdbc的jar包

    在Spring JDBC中,事务管理是至关重要的,因为它确保了数据库操作的一致性和完整性。`PlatformTransactionManager`是Spring中处理事务的核心接口,而`DataSourceTransactionManager`是实现该接口的具体类,用于基于...

    springjdbc.zip_SpringJDBC_spring jdbc_spring 增删改查_springjdbc xml

    综上所述,`springjdbc.zip`文件中的示例可能展示了如何在Spring环境中配置和使用JDBC,包括数据源配置、事务管理、以及使用`JdbcTemplate`执行增删改查操作的完整流程。通过学习这些示例,开发者可以更好地理解和...

    spring jdbc示例代码

    3. **Transaction Management**:Spring JDBC支持声明式事务管理,这意味着我们可以在XML配置文件中定义事务边界,而不是在代码中显式地控制事务的开始、提交和回滚。 4. **PreparedStatement**:Spring JDBC鼓励...

    spring jdbc相关包版本5.1.3

    6. **spring-tx-5.1.3.RELEASE.jar**:处理事务管理,包括编程式和声明式事务管理,与Spring JDBC紧密配合,确保数据一致性。 7. **mysql-connector-java-8.0.11.jar**:这是MySQL数据库的驱动包,用于建立Java应用...

Global site tag (gtag.js) - Google Analytics