Java学习笔记

Spring--day03

2017-03-08  本文已影响61人  键盘瞎

非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿


感谢传智博客及黑马程序猿

Spring的事务管理

回顾事务

什么是事务?

事务四个特性?

不考虑隔离性产生读问题

不考虑隔离性产生一类写问题-丢失更新

解决丢失更新

解决读问题-设置事务隔离级别

Mysql默认隔离级别 repeatable read

Hibernate事务特点:不是自动提交

应用场景:银行转账

Spring使用事务接口

• Spring事务管理高层抽象主要包括3个接口
• PlatformTransactionManager:事务管理器
• TransactionDefinition:事务定义信息(隔离、传播、超时、只读)
• TransactionStatus:事务具体运行状态

首先,配置事务管理器,使用接口PlatformTransactionManager对应的实现类配置

配置说明

Spring的事务概述

Spring支持两种方式事务管理

编程式的事务管理

在实际应用中很少用;通过TransactionTemplate手动管理事务

使用xml配置声明式事务

开发中推荐使用(代码入侵性最小);Spring的声明式事务是通过AOP实现的

搭建事务操作的环境(转账)

第一步:创建数据库,创建表

数据表

第二步:创建dao,Service

第三步:配置Service和dao对象,完成注入关系

<bean id="userService" class="cn.xx.UserService">
    <property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="cn.xx.UserDao"></bean>

第四步:连接池配置,注入到dao

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql:///spring"></property>
    <property name="user" value="root"></property>
    <property name="password" value="root"></property>
</bean>

<bean id="userDao" class="cn.xx.UserDao">
    <property name="dataSource" ref="dataSource"></property>
</bean>
public class UserDao extends JdbcTemplate{
  
}

第五步:在dao实现转账的方法

public void out() {
    String sql = "update account set money = money - 100 where id = ?";
    this.getJdbcTemplate().update(sql, 1);
}

public void in() {
    String sql = "update account set money = money + 100 where id = ?";
    this.getJdbcTemplate().update(sql, 2);
}

第六步:在Service里面调用dao的方法实现转账的逻辑

public void accountMoney {
    userDao.out();
    userDao.in();
}

产生问题

userDao.out();
int a = 10 / 0;
userDao.in();

如果东方不败少了100.之后,出现异常,小奥不会多100,但是100丢失了

使用事务可以解决钱丢失的问题。

编程式事务管理

第一步:导入事务的相关jar包,引入相关的约束

第二步:配置事务管理器

使用jdbcTemplate,使用PlatformTransactionManager接口里面的是实现类DataSourceTransactionManager

<bean id="transactionManager" class="org.springframework.jdb.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

第三步:配置事务管理器的模板

<bean id="" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
</bean>

第四步:在Service里面注入事务管理器的模板

public class UserService{
    private TransactionTemplate transactionTemplate;
    public void setTransactionTemplate getTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }
}
<bean id="userService" class="cn.xx.UserService">
    <property name="userDao" ref="userDao"></property>
    <property name="transactionTemplate" ref="transactioinTemplate"></property>
</bean>

第五步:需要在Service里面手动写代码,进行事务管理

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(TransactionStatus args0) {
        userDao.out();
        int a = 10 / 0;
        userDao.in();
    }
});

第六步:测试编程是事务操作

如果进行操作时候,没有出现异常,正常执行,但是调用了一个方法之后,出现了异常,事务回滚。

声明式事务管理(重点)

基于aspectj的xml方式

使用Aop思想实现的事务管理

第一步:配置事务管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

第二步:配置增强

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!-- 配置哪个方法增强 -->
    <tx:attributes>
        <!-- name:service里面的方法accountMoney -->
        <tx:method name="accountMoney" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

第三步:配置切面

<aop:config>
    <aop:pointcut expression="execution(* cn.xx.UserService.accountMoney(..))" id="point1"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="point1"/>
</aop:config>

基于注解方式

第一步:配置事务管理器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

第二步:开始事务的注解

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

第三步:在哪个类中的方法使用事务,就在那个类上面使用注解

@Transaction
public class UserService {
  
}

不是很详细,还请大家自己找些资料查看

上一篇下一篇

猜你喜欢

热点阅读