开源连接池
前提是导入依赖,就不一一截图了。
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, 如何解决安全性问题:
- 读问题解决,设置数据库隔离级别
- 写问题解决,悲观锁和乐观锁的方式解决
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出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)。
- PROPAGATION_REQUIRED(默认值)
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"/>