目录

 

一、事务管理方案

1. 修改业务层代码

2. 测试

二、事务管理器

1. 简介

2. 在配置文件中引入约束

3. 进行事务配置

三、事务控制的API

1. PlatformTransactionManager接口

2. TransactionDefinition接口

3. TransactionStatus接口

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章 

一、事务管理方案

        声明式事务底层采用AOP技术,在service层手动添加事务就可以解决上一篇提到的问题。

1. 修改业务层代码

        添加一个SqlSessionTemplate对象,让我们对业务方法进行try catch,没有异常则进行提交,捕捉到异常回滚即可。

package com.example.service;

import com.example.dao.AccountDao;

import com.example.pojo.Account;

import org.mybatis.spring.SqlSessionTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Isolation;

import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;

@Service

public class AccountService {

@Autowired

private AccountDao accountDao;

@Autowired

private SqlSessionTemplate sessionTemplate;

/**

*

* @param id1 转出人id

* @param id2 转入人id

* @param price 金额

*/

// 作用方法上时,该方法都将具有该类型事务的事务属性

public void transfer(int id1,int id2, double price){

try {

// 转出人减少余额

Account account1 = accountDao.findById(id1);

account1.setBalance(account1.getBalance() - price);

accountDao.update(account1);

// 模拟程序出错

int i = 1 / 0;

// 转入人增加余额

Account account2 = accountDao.findById(id2);

account2.setBalance(account2.getBalance() + price);

accountDao.update(account2);

sessionTemplate.commit();

}

catch (Exception e){

e.printStackTrace();

sessionTemplate.rollback();

}

}

}

2. 测试

 OK,可以看到这里程序是出现异常中断了的。 现在观看数据库里面的情况是怎么样的。 

        OK,可以看到这里张三确实没有被扣钱啊,所以手动提交事务也是可以的,但是这样我们的try catch就太多了。因此有了事务管理器。

二、事务管理器

1. 简介

        Spring依赖事务管理器进行事务管理,事务管理器即一个通知类,我们为该通知类设置切点为service层方法即可完成事务自动管理。由于不同技术操作数据库,进行事务操作的方法不同。如:JDBC提交事务是 connection.commit() ,MyBatis提交事务是 sqlSession.commit() ,所以Spring提供了多个事务管理器。

事务管理器名称作用org.springframework.jdbc.datasource.DataSourceTransactionManager针对JDBC技术提供的事务管理器。适用于JDBC和MyBatis。org.springframework.orm.hibernate3.HibernateTransactionManager针对于Hibernate框架提供的事务管理器。适用于Hibernate框架。org.springframework.orm.jpa.JpaTransactionManager针对于JPA技术提供的事务管理器。适用于JPA技术。org.springframework.transaction.jta.JtaTransactionManager跨越了多个事务管理源。适用在两个或者是多个不同的数据源中实现事务控制。

        我们使用MyBatis操作数据库,接下来使用 DataSourceTransactionManager 进行事务管理。

2. 在配置文件中引入约束

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

3. 进行事务配置

在applicationContext.xml文件新增配置

三、事务控制的API

        事务管理器都实现了PlatformTransactionManager接口,Spring进行事务控制的功能是由三个接口提供的,这三个接口是Spring实现的,在开发中我们很少使用到,只需要了解他们的作用即可:

1. PlatformTransactionManager接口

PlatformTransactionManager是Spring提供的事务管理器接口,所有事务管理器都实现了该接口。该接口中提供了三个事务操作方法:

TransactionStatus getTransaction(TransactionDefinition definition):获取事务状态信息。void commit(TransactionStatus status):事务提交void rollback(TransactionStatus status):事务回滚

2. TransactionDefinition接口

TransactionDefinition是事务的定义信息对象,它有如下方法:

String getName():获取事务对象名称。int getIsolationLevel():获取事务的隔离级别。int getPropagationBehavior():获取事务的传播行为。int getTimeout():获取事务的超时时间。boolean isReadOnly():获取事务是否只读。

3. TransactionStatus接口

TransactionStatus是事务的状态接口,它描述了某一时间点上事务的状态信息。它有如下方法:

void flush()  刷新事务boolean hasSavepoint() 获取是否存在保存点boolean isCompleted() 获取事务是否完成boolean isNewTransaction() 获取是否是新事务boolean isRollbackOnly() 获取是否回滚void setRollbackOnly()  设置事务回滚

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置Mybatis入门案例【超详细】MyBatis配置文件 —— 相关标签详解Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)Mybatis分页查询——四种传参方式Mybatis一级缓存和二级缓存(带测试方法)Mybatis分解式查询Mybatis关联查询【附实战案例】MyBatis注解开发---实现增删查改和动态SQLMyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章 

Spring系列专栏Spring IOC 入门简介【自定义容器实例】IOC使用Spring实现附实例详解Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式Spring DI简介及依赖注入方式和依赖注入类型Spring IOC相关注解运用——上篇Spring IOC相关注解运用——下篇Spring AOP简介及相关案例注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】Spring事务简介及相关案例Spring 事务管理方案和事务管理器及事务控制的APISpring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: