您的位置:首页 > 编程语言 > Java开发

Spring基础-5-事务管理

2017-10-24 16:32 393 查看

开源连接池

前提是导入依赖,就不一一截图了。

1,管理DBCP连接池

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring_day03"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>


2,管理C3P0连接池

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


Spring事务管理

1,相关基础知识

1.1,事务:

指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败!

1.2,事务的特性:

原子性

一致性

隔离性

持久性

1.3,如果不考虑隔离性,引发安全性问题:

读问题

脏读

不可重复读

虚读

写问题

丢失更新

1.4, 如何解决安全性问题:

4000
读问题解决,设置数据库隔离级别

写问题解决,悲观锁和乐观锁的方式解决

2,事务管理相关的类和API

PlatformTransactionManager接口

平台事务管理器。(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类。

TransactionDefinition接口

事务定义信息。(事务的隔离级别、传播行为、超时、只读)

TransactionStatus接口

事务的状态

上述对象之间的关系:平台事务管理器真正管理事务对象.根据事务定义的信息TransactionDefinition 进行事务管理,在管理事务中产生一些状态.将状态记录到TransactionStatus中

2.1,PlatformTransactionManager接口:

接口的实现类

如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类

如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类

该接口的常用方法

void commit(TransactionStatus status)

TransactionStatus getTransaction(TransactionDefinition definition)

void rollback(TransactionStatus status)

2.2,TransactionDefinition:

事务隔离级别的常量

static int ISOLATION_DEFAULT – 采用数据库的默认隔离级别

static int ISOLATION_READ_UNCOMMITTED

static int ISOLATION_READ_COMMITTED

static int ISOLATION_REPEATABLE_READ

static int ISOLATION_SERIALIZABLE

事务的传播行为常量(不用设置,使用默认值):解决的是业务层之间的方法调用

PROPAGATION_REQUIRED(默认值)

A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来。(保证A,B在同一个事务中),默认值。

PROPAGATION_SUPPORTS

A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务。

PROPAGATION_MANDATORY

A中有事务,使用A中的事务.如果A没有事务.抛出异常。

PROPAGATION_REQUIRES_NEW(记)

A中有事务,将A中的事务挂起.B创建一个新的事务。(保证A,B没有在一个事务中)

PROPAGATION_NOT_SUPPORTED

A中有事务,将A中的事务挂起。

PROPAGATION_NEVER

A中有事务,抛出异常。

PROPAGATION_NESTED(记)

嵌套事务。当A执行之后,就会在这个位置设置一个保存点。如果B没有问题,执行通过。如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)。

3,事务管理实现

3.1,准备工作(创建对应的包结构和类)

package

com.itheima.demo1

class

AccountService

AccountServlceImpl

AccountDao

AccountDaoImpl

3.2,事务管理分类:

手动编码事务管理(不推荐)

声明式事务管理:

基于AspectJ的XML方式

基于AspectJ的注解方式

3.2.1,基于AspectJ的XML方式:

3.2.1.1,工厂中的最基础的bean:

数据库连接池

平台事务管理器

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


service

dao

3.2.1.2,配置通知:

<!-- 配置事务增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
name        :绑定事务的方法名,可以使用通配符,可以配置多个。
propagation :传播行为
isolation   :隔离级别
read-only   :是否只读
timeout     :超时信息
rollback-for:发生哪些异常回滚.
no-rollback-for:发生哪些异常不回滚.
-->
<!-- 哪些方法加事务 -->
<tx:method name="pay" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>


3.2.1.3,配置切面:

<!-- 配置AOP切面产生代理 -->
<aop:config>
<aop:advisor advice-ref="myAdvice" pointcut="execution(* com.itheima.demo2.AccountServiceImpl.pay(..))"/>
</aop:config>


注意:如果是自己编写的切面,使用标签,如果是系统制作的,使用标签。

3.2.2,基于AspectJ的注解方式:

3.2.2.1,工厂中的最基础的bean

和3.2.1.1中的情况是一样的。

3.2.2.2,开启事务的注解

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


3.2.2.3,在业务层上添加一个注解:@Transactional
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: