项目搭建POC之基础spring事务

本文介绍了项目中搭建POC测试用的基础Spring事务管理,包括事务的ACID特性、并发事务处理问题及隔离级别。重点阐述了Spring的事务配置,并讨论了<aop:aspectj-autoproxy />在事务管理中的作用,以及proxy-target-class属性对代理类型的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重新搭建项目POC测试用,时间有余,将一些基本知识记录之。

spring中配置事务:

事务是什么:事务是由一组sql语句组成的逻辑处理单元

ACID:原子性(Atomicity)、一致性(Consistent):、隔离性(Isolation)、持久性(Durable)

1、原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行

2、一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性,事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

3、隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发造作影响的独立环境执行,这意味着事务处理过程中的中间状态对外部是不可见的。

4、持久性(Durable):事务完成之后,它对数据的修改是永久性的,即使系统出现故障也能保持

 

并发事务处理带来的问题:有问题就有隔离级别

脏读(Dirty Reads):事务A读取到事务B已修改但尚未提交的数据,还在这个数据基础上做了操作,此时如果B事务回滚,A读取的数据无效,不符合一致性要求。

不可重复读:在同一个事务内,可能多次读取同一个数据,如果这个事务还没有结束,另一个事务也访问同一条数据,并且可能修改了,那么第一个事务中多次读取的数据就可能不一样,这就是不可重复读,即原始读取不可重复。一句话:一个事务范围内两个相同的查询却返回了不同的数据。

幻读:一个事务按相同条件重新读取之前检索过的数据,却发现其他事务插入了满足其条件的新数据,就是幻读。一句话:事务A读取到了事务B提交的新增数据,不符合隔离性。InnoDB用多版本并发控制机制解决该问题

 

事务隔离级别:

未提交读(Read uncommitted):最低级别,只保证不读取物理上损坏的数据

已提交读(Read committed):语句级

可重复读(Repeatable read):事务级,mysql默认的

可序列化(Serializable):最高级别,事务级,也叫可串行化

 

项目中使用:

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

    <!--拦截器的方式配置事务-->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--给不同的方法设置事务传播特性,传播特性一共有七种 REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启
            SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。-->
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="append*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="modify*" propagation="REQUIRED"/>
            <tx:method name="edit*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="repair*" propagation="REQUIRED"/>
            <tx:method name="delAndRepair" propagation="REQUIRED"/>

            <tx:method name="get*" propagation="SUPPORTS"/>
            <tx:method name="find*" propagation="SUPPORTS"/>
            <tx:method name="load*" propagation="SUPPORTS"/>
            <tx:method name="search*" propagation="SUPPORTS"/>
            <tx:method name="datagrid*" propagation="SUPPORTS"/>

            <tx:method name="*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>

    <!--配置在哪些类中的那些方法上使用事务-->
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.service.ms..*.*(..))"/>
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
    </aop:config>

还在springmvc.xml中配置:

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

这里不是很理解,查资料解释为:暂时还不理解

通过aop命名空间的<aop:aspectj-autoproxy />声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被<aop:aspectj-autoproxy />隐藏起来了

<aop:aspectj-autoproxy/>有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,当配为<aop:aspectj-autoproxy poxy-target-class="true"/>时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值