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,准备工作(创建对应的包结构和类)
packagecom.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
相关文章推荐
- java 框架基础知识(7)----事务基础知识-->Spring事务管理
- 【Spring DAO】事务管理基础
- spring(基础16) Spring事务管理二
- Spring基础-事务管理(六)
- Spring的事务管理基础情况(六)
- JavaEE进阶知识学习-----SpringBoot基础知识-5-事务管理知识
- Spring 中基础配置和事务管理的配置和spring托管hibernate配置文件的方法
- Spring基础学习(五)—事务管理
- Spring事务管理-使用基础
- Beginning Spring学习笔记——第6章(一)Spring事务管理基础
- Spring基础学习(五)—事务管理
- [Spring框架]Spring 事务管理基础入门总结.
- [Spring框架]Spring 事务管理基础入门总结.
- Spring学习之事务管理基础
- Spring的事务管理基础知识
- Spring JDBC-Spring事务管理之ThreadLocal基础知识
- spring 事务管理(基础)
- 事务基础知识-->Spring事务管理:http://www.iteye.com/topic/1124043
- Spring的事务管理基础知识
- 全面分析 Spring 的编程式事务管理及声明式事务管理