Spring的事务管理
目录
Spring的事务管理
一、事务的定义?
二、事务的四大特征
1.原子性
2.一致性
3.隔离性
4.持久性?
三、事务引发的问题?
四、事务的隔离级别?
五、事务的管理原理
1.PlatfromTransactionManager ---平台事务管理器
2.TransactionDefinition(事务的定义)?
3. TransactionStatus--事务状态
总结
?六、事务的七种传播行为(Propagation)
七、编程式事务管理
八、声明式事务管理
? 1.基于xml的事务管理
? 2.基于注解的事务管理
九、spring整合日志框架
1. log4j
2. log4j2
一、事务的定义?
事务是一组最小的逻辑单元,这组单元中的操作要么全部执行成功,要么全部失败
二、事务的四大特征
1.原子性
事务是最小单元,不可分割
2.一致性
3.隔离性
事务之间互不影响
4.持久性?
事务一旦提交,数据会持久化到数据库中
三、事务引发的问题?
- ?脏读 :一个事务读到了另一个事务没有提交的数据
- 虚读(幻读): 读同一张表,多次读取行数不一致
- 不可重复读 :查同一条数据,多次读取结果不一致
四、事务的隔离级别?
read uncommited??
?未提交读(无法解决任何问题)
read commited
已提交读(解决了脏读的问题)
repeatable read??
可重复读。解决了虚读
serializeable
串行化,使用了嵌套事务解决了所以问题
数据库的默认隔离界别
mysql---- repeatable read
oralce、selserver默认 read commited
五、事务的管理原理
1.PlatfromTransactionManager ---平台事务管理器
用于规范如何管理事务?
?接口:? ?
? ? ? ? ? ? ?JdbcTransactionManager? :基于jdbc的平台事务管理器
? ? ? ? ? ? ?HibernateTransactionManager:基于hibernate的平台事务管理器,导入spring-orm.jar? 用于整合ORM框架
2.TransactionDefinition(事务的定义)?
定义了事务的相关属性
3. TransactionStatus--事务状态
? ?hasSavePoint 是否包含有回滚点
? ?isNewTransaction 是否为新的事务
? ?isCompleted 事务是否已经完成
总结
平台事务管理器根据自身不同,选择相应的方式来创建事务,并将创建后事务的信息,保存在TransactionDefinition中,事务在执行的过程中,会发生状态的变化,平台事务管理器会将状态的变化记录在TransactionStatus中
?六、事务的七种传播行为(Propagation)
? ?REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
? ?SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
? ?MANDATORY:支持当前事务,如果当前没有事务,就抛出异常
? REQUIRE_NEW:新建事务,如果当前存在事务,就把当前事务挂起
?NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,就把当前事务挂起
?NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务
七、编程式事务管理
? ?1.根据dao的底层技术选择对应的事务管理平台---我们一般都是使用JdbcTransactionManage
<!-- 平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.support.Jdb cTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.创建TransactionTemplate(事务管理模板)的bean??
<!--
提供了事务管理的相关操作 采用了数据库默认的隔离级别 采用了spring默认的传播行为 Propagtion_required
property---- 设置要用的事务管理平台
-->
<bean id="transactionTemplate" class="org.springframework.transaction.supp ort.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
3.测试
//测试事务 ---编程式事务管理
@Autowired
private TransactionTemplate transactionTemplate;
@org.junit.Test
public void testTranction() {
transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus arg0) {
Account account1=new Account();
account1.setUserId(5);
account1.setAccount(-400);
account1.setOperateDate("2022-7-12");
accountDao.save(account1);
int i=1/0;
Account account2=new Account();
account2.setUserId(6);
account2.setAccount(400);
account2.setOperateDate("2022-7-12");
accountDao.save(account2);
return null;
?缺点:改变了业务逻辑的结构
八、声明式事务管理
在spring中提供了事务管理,采用AOP的形式,对切入点进行事务的增强,并且spring提供了事务增强的标签,只需要通过配置就能够实现事务管理
? 1.基于xml的事务管理
1.
平台事务管理器
<!-- 平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.support.Jdb cTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.
增加
tx
标签,
spring
提供的增强、
<!-- 事务的增强 transaction-manager:指定增强采用的平台事务管理 器 -->
<tx:advice id="tx" transaction- manager="transactionManager">
<!-- 事务的属性的配置-->
<tx:attributes>
<!-- 在切入点的基础上对不同的方法进行不同的事务配置 -->
<tx:method name="insert*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED"/>
<!-- read-only:true可以提高查询效率 -->
<tx:method name="query*" read- only="true" isolation="DEFAULT" propagation="REQUIRED"/> <tx:method name="select*" read- only="true" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
3.aop
配置、
<aop:config>
<!--切入点表达式-->
<aop:pointcut expression="execution(* com.sofwin.service.impl.*.*(..))" id="p1"/>
<!-- 增强的方法 tx 切入点表达式p1-->
<aop:advisor advice-ref="tx" pointcut- ref="p1"/>
</aop:config>
注意
因为spring的声明事务采用的AIP
1.所以同类中的方法调用会导致事务失效
? ?
class Service1{
a(){ }
b(){ }
c(){
a()
int i=1/0;
b()
}
? ?要这样改动--才不会失效
class Service1{
@autoWird Service1 service;
a(){ }
b(){ }
c(){
service.a()
int i=1/0;
service.b() }
2.不是public修饰的方法--会失效
3.被final修饰的方法---会失效
? 2.基于注解的事务管理
? ? 1.定义平台事务管理器
<!-- 平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.support.Jdb cTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
? ? 2.开启事务的注解驱动和注解的组件扫描
<context:component-scan base-package="com.sofwin"></context:component-scan>
<tx:annotation-driven transaction-manager="jdbcTransactionManager"/>
?3.常用的注解
@Transactional?
?类级别:该类中所以方法使用了定义的事务
?方法级别:该方法使用了定义的事务
九、spring整合日志框架
早期
spring
版本中不包含
jcl,
提供了日志的接口,整合日
志的实现。
1. log4j
log4j.jar
log4j.properties
2. log4j2
log4j-core.jar
log4j-api.jar
增加:
log4j2.xml
|