Spring 事物 ( 已转账为例 ) 基于 AOP 注解

<一> 配置为文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
>

    <!-- 配置 C3P0 连接池数据源, 作为 DAO 层的数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl">
            <value>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</value>
        </property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="user" value="root"></property>
        <property name="password" value="920619"></property>
    </bean>

    <!-- 配置 DAO 层, 把 C3P0 连接池作为数据源注入到 DAO 层 -->
    <bean id="accountDao" class="spring.things_2.AccountDao">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置 SERVICE 层, 把 DAO 层注入到 SERVICE 层 -->
    <bean id="accountService" class="spring.things_2.AccountService">
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!-- 配置事物管理类 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 开启注解事物 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

</beans>

<二> Dao 层和 Service 层的接口

package spring.things_2;

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

public class AccountDao extends JdbcDaoSupport implements IAccountDao {

    @Override
    public void outMoney(String outName, double money) {
        String sql = "update User set money = money - ? where UserName = ?";
        this.getJdbcTemplate().update(sql, money, outName);
    }

    @Override
    public void inMoney(String inName, double money) {
        String sql = "update User set money = money + ? where UserName = ?";
        this.getJdbcTemplate().update(sql, money, inName);
    }

}
package spring.things_2;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 注解该类为事物类( 参数类型如下 )
 * propagation:   事物的传播行为
 * isolation:     事物的隔离级别
 * readOnly:      是否只读
 * rollbackFor:   被回滚的异常类型
 * noRollbackFor: 不会滚的异常类型
 */
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT)
public class AccountService implements IAccountService {

    // 注入的 Dao 层
    private AccountDao accountDao;
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    // 这个方法在测试中是一个事物单元
    @Override
    public void transfer(String outName, String inName, double money) {
        accountDao.outMoney(outName, money);
        accountDao.inMoney(inName, money);
    }

}

< 三 > 接口的实现类

package spring.things_2;

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

public class AccountDao extends JdbcDaoSupport implements IAccountDao {

    @Override
    public void outMoney(String outName, double money) {
        String sql = "update User set money = money - ? where UserName = ?";
        this.getJdbcTemplate().update(sql, money, outName);
    }

    @Override
    public void inMoney(String inName, double money) {
        String sql = "update User set money = money + ? where UserName = ?";
        this.getJdbcTemplate().update(sql, money, inName);
    }

}
package spring.things_2;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 注解该类为事物类( 参数类型如下 )
 * propagation:   事物的传播行为
 * isolation:     事物的隔离级别
 * readOnly:      是否只读
 * rollbackFor:   被回滚的异常类型
 * noRollbackFor: 不会滚的异常类型
 */
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT)
public class AccountService implements IAccountService {

    // 注入的 Dao 层
    private AccountDao accountDao;
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    // 这个方法在测试中是一个事物单元
    @Override
    public void transfer(String outName, String inName, double money) {
        accountDao.outMoney(outName, money);
        accountDao.inMoney(inName, money);
    }

}
时间: 2024-08-07 20:02:52

Spring 事物 ( 已转账为例 ) 基于 AOP 注解的相关文章

Java实战之03Spring-05Spring中的事务控制(基于AOP)

五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1.2.Spring事务管理主要包括3个接口 1.2.1.PlatformTransactionManager事务管理器 具体实现类: 1.2.2.TransactionDefinition事务定义信息 事务的隔离级别: 事务的传播行为:有时面试会问到 REQUIRED:如果当前没有事务,就新建一个事务

spring事物配置,声明式事务管理和基于@Transactional注解的使用

参考来源:http://blog.csdn.net/bao19901210/article/details/41724355 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用TransactionTemplate. 声明式事务管理建立在A

Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

spring中基于aop使用ehcache

继续上篇,这篇介绍服务层缓存,基于aop的方式使用ehcache 一.修改配置文件 修改spring-context-ehcache.xml文件,加入: <!-- ehcache缓存实例 --> <bean id="testCacheInterceptor" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheMa

Spring入门第4天--Spring事物管理

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.24 lutianfei none 事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性:ACID 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致. 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 持久性:一旦结束,数据就永久的保存到数据库. 如果不考虑隔离性: 脏读:一个事务读到另一个事务未提交数据 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事

spring事物管理--声明式(AspectJ)(推荐使用)

1.表结构及数据 2.需引入的jar包: 3.业务层(Service).持久层(Dao)接口与实现类 Service接口: //转账案例业务层接口 public interface AccountService { /** * @param out :转出账号 * @param in :转入账号 * @param money :转账金额 */ public void transfer(String out,String in,Double money); } Service实现类: //转账案例

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

spring事物管理

一)spring的事务管理     事务管理并非spring独有,用过JDBC hibernate的朋友都知道,这些api和框架都提供了自己的事务管理机制.那么spring的事务管理又有些什么与众不同支持呢?它的优点又有哪些呢?总结来说大概有以下这么几点: 1' 为不同的事务API提供一致的编程模型,如Java Transaction API (JTA).JDBC.Hibernate.JavaPersistenceAPI(JPA)以及JavaDataObjects(JDO) 2' 支持decla

Spring事物管理--编程式

以简单的转账金额为例: 1.数据库(建表.插入数据) CREATE TABLE account ( id INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, money DOUBLE DEFAULT NULL, PRIMARY KEY(id) )ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO account VALUE('1','aaa',1000