第11章 Spring练习2-2 3

本文展示了如何在Spring框架中实现编程式和声明式事务管理。编程式事务管理通过TransactionTemplate和PlatformTransactionManager进行事务控制,而声明式事务管理则利用TransactionProxyFactoryBean和事务属性来定义事务边界。这两种方法都确保了数据库操作的一致性和完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程式事务管理

在配置文件中声明事务管理器和TransactionTemplate

<!--  定义TransactionTemplate模板  -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRED</value>
</property>
</bean>
<!--  定义事务管理器  -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!--  为TransactionExample注入数据源 、事务管理器、TransactionTemplate模板 -->
<bean id="transactionExample" class="com.mr.transaction.TransactionExample">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionTemplate">
<ref bean="transactionTemplate"/>
</property>
</bean>
</beans>

创建类 TransactionExample,定义添加数据的方法,执行两次添加数据库操作并用事务保护操作.以匿名类的方式定义TransactionCallback接口的实现来处理事务管理。

package com.mr.transaction;

import java.sql.Connection;
import java.sql.Statement;

import javax.sql.DataSource;

import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

public class TransactionExample {
    DataSource dataSource;//注入数据源
    PlatformTransactionManager transactionManager;//注入事务管理器
    TransactionTemplate transactionTemplate;//注入TransactionTemplate模板
    public DataSource getDataSource() {
        return dataSource;
    }
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    public PlatformTransactionManager getTransactionManager() {
        return transactionManager;
    }
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }
    public TransactionTemplate getTransactionTemplate() {
        return transactionTemplate;
    }
    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }
    public void transactionOperation() {
        transactionTemplate.execute(new TransactionCallback() {
            public Object doInTransaction(TransactionStatus status) {
                Connection conn = DataSourceUtils.getConnection(dataSource);//获得数据库连接
                try {
                    Statement stmt = conn.createStatement();
                    //执行两次添加方法
                    stmt.execute("insert into tb_user(name,age,sex) values('Psychee','20','女')");
                    int a=0;//制造异常测试事务是否配置成功
                    a=9/a;
                    stmt.execute("insert into tb_user(name,age,sex) values('Joseph','25','男')");
                    System.out.println("操作执行成功!");
                } catch (Exception e) {
                    transactionManager.rollback(status);//事务回滚
                    System.out.println("操作执行失败,事务回滚!");
                    System.out.println("原因:"+e.getMessage());
                }
                return null;
            }
        });
    }
}

创建类manager

package com.mr.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mr.transaction.TransactionExample;


public class Manager {

    public static void main(String[] args) {
        ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");            //装载配置文件
        TransactionExample transactionExample = (TransactionExample) factory.getBean("transactionExample");//获取UserDAO
        transactionExample.transactionOperation();//执行添加方法
    }
}

编程式事务管理是指在程序代码中显式地定义事务的边界和操作,以确保数据在数据库中的一系列操作都成功或都失败。这种方法可以保持数据的一致性、完整性和可靠性。

通俗来说,编程式事务管理就像你在银行取钱时需要输入密码,然后进行多个操作(比如转账、查询余额等),如果其中有任何一个操作失败,整个操作就会回滚到最初状态,不会对你的账户造成影响;只有当所有操作都成功完成,才会提交并更新你的账户信息,这样可以保证你的账户数据的正确性。在程序设计中使用编程式事务管理,同样可以确保一系列操作的正确性和完整性。

声明式事务管理

修改配置文件,定义数据源datasource和事务管理器

<!--  定义事务管理器  -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!--  定义TransactionProxy  -->
<bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<bean id="addDAO" class="com.mr.dao.AddDAO">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
</property>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>

编写adddao类操作数据库。在adduser()方法中执行数据插入操作。在配置时定义为事务性方法并指明了事务属性。

package com.mr.dao;


import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.mr.user.User;

public class AddDAO extends JdbcDaoSupport {
    //添加用户的方法
    public void addUser(User user){
        //执行添加方法的sql语句
        String sql="insert into tb_user (name,age,sex) values('" + 
                    user.getName() + "','" + user.getAge()+ "','" + user.getSex()+ "')";
        //执行两次添加方法
        getJdbcTemplate().execute(sql);
        int a=0;//制造异常测试事务是否配置成功
        a=9/a;
        getJdbcTemplate().execute(sql);
    }
}

创建manager类

package com.mr.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mr.dao.AddDAO;
import com.mr.user.User;

public class Manager {
    public static void main(String[] args) {
    	ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");  //装载配置文件
        AddDAO addDAO = (AddDAO)factory.getBean("transactionProxy");//获取AddDAO
        User user = new User();//实例化User实体对象
        user.setName("Joseph");//设置姓名
        user.setAge(25);//设置年龄
        user.setSex("男");//设置性别
        addDAO.addUser(user);//执行数据库添加方法
    }
}

声明式事务管理是一种基于注解或配置的方式来实现事务管理,而不需要在代码中显式地定义事务边界和操作。这种方法通过对代码进行标记或配置来指示何时开启和提交事务,以及何时回滚事务。

通俗来说,声明式事务管理就像你在银行取钱时,只需要填写一张转账单,并在上面写明所需转账金额、账户号码等信息,然后将单据交给银行职员即可,无需关心银行内部是如何处理这些操作的。在程序设计中使用声明式事务管理,同样可以简化代码的编写和维护,同时也提高了代码的可读性和可重用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值