【Spring】学习四(事务)

本文深入解析Spring框架中的声明式事务管理,包括编程式事务与声明式事务的区别,事务属性如传播行为、隔离级别及回滚策略的详细解释,以及如何在Spring配置文件中设置声明式事务。

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

 

目录

 

 

 

一:声明式事务

 

二:声明式事务中属性解释

 

三:Spring 中的常用注解

 


 

 

一:声明式事务

 

1、编程式事务

                      1.1 由程序员编程事务控制代码。

                      1.2 OpenSessionInView  编程式事务

 

2、 声明式事务

                      2.1 事务控制代码已经由Spring写好。程序员只需要声明出哪些方法需要进行事务控制 和 如何进行控制!

 

3、 声明式事务都只是针对 ServiceImpl 下的类下的方法(因为Spring只能管理 service 层!)

 

4、 事务管理器基于通知(Advice)的!

 

5、 在Spring配置文件中配置声明式事务



<context:property-placeholder location="classpath:db.properties,classpath:second.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
          value="${jdbc.driver}"></property>
<property name="url"
          value="${jdbc.url}"></property>
<property name="username"
          value="${jdbc.username}"></property>
<property name="password"
          value="${jdbc.password}"></property>
</bean>

<bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionM
anager">
    <property name="dataSource"ref="dataSource"></property>
</bean>


<!-- 配置声明式事务 -->
<tx:advice id="txAdvice" transaction-manager="txManager" class>
    <tx:attributes>
    <!-- 哪些方法需要有事务控制 -->
    <!-- 方法以 ins 开头事务的管理 -->
    <tx:method name="ins*" />
    <tx:method name="del*" />
    <tx:method name="upd*" />
    <tx:method name="*" read-only="true" />   <!-- 表示所有的事务都拦截,且只为只读 -->
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut expression="excution(* com.bjsxt.service.impl.*.*(..))" id="mypoint"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" />
</aop:config>

 

 

 

二:声明式事务中属性解释

 

1、 name=" " 哪些方法需要被管理,控制。

                                          1.1  支持 * 通配符!

2、read-only="boolean" 是否是只读事务!

                                          2.1 如果为true,告诉数据库此事务为只读事务,数据会优化,会对性能有一定替身,所以只要是查询的方法,建议使用此数据,

                                          2.2 如果为 false(默认值),事务需要提交的事务,建议新增,删除,修改!

 

3、 propagation  控制事务传播行为。

                                        3.1  当一个具有事务控制的方法被另外一个有事务控制的方法调用后,需要如何管理事务??(新建事务?在事务中执行?把事务挂起?报异常??)      如下!

@Override

public int insert(User users){

        return 0;

}

@Override

public int insertUsers(User users){

           insert(users);

           return 0;

}

                                           3.2  REQUIRED   (默认值) : 如果当前有事务,就在事务中执行,如果当前没有事务,就新建一个事务。

                                          

                                           3.3  SUPPORTS   (随遇而安)如果当前有事务就在事务下执行,如果没有事务。就在非事务状态下执行!

 

                                           3.4 MANDATORY    (傲娇)必须在事务内部执行,如果当前有事务,就在事务内执行,如果没有事务则报错!

                                           

                                           3.5 REQUIRES_NEW    (横行霸道,必须是自己的事务才执行)必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,就把当前事务挂起。

               

                                           3.6 NOT_SUPPORTED    (另类独行) 必须在非事务下执行,如果当前有事务就把事务挂起,如果没有就正好!

 

 

 

4、  isolation    事务的隔离级别。

                                  4.1  在多线程或并发的情况下如何保证访问到的数据具有完整性。

                                  4.2 脏读 :

                                                         一个事务(A)读到另外一个事务(B)w未提交的数据,另一个事务中数据可能进行了改变,此时事务(A)读取的数据可能和数据库中的不一致,此时认为数据是脏数据,读取脏数据的过程叫脏读!

                 

                                   4.3 不可重复读

                                                         主要针对的是某行数据(或行中的某列),主要针对的操作是修改操作,两次读取在同一个事务

                                                         当事务A读取一次事务后,事务B对事务A读取的数据进行了修改, 事务A 再次读取数据的时候,发现读取的数据和之前读取的数据不一致,这就是不可重复读。

                   

                                    4.4  幻读  

                                                         主要针对的是新增或者删除,两次事务的结果,

                                                         事务A按照特定的条件查询出结果,事务B新增了一条符合条件的数据,事务再次查询时发现 A中查询的数据和数据库中的数据不一致,事务A以为自己出现了幻觉,这种情况称为幻读。

                                         

                                    4.5 isolation 的取值:

                                                     1. DEFAULT  默认值,由底层数据库自动判断应该使用什么隔离界别!

                                                      2.  READ_UNCOMMITTED :  可以读取为提交的数据。可能出现脏读,不可重复读,幻读。(效率最高,但是最不安全)。

                                                      3.  READ_COMMITTED  :只能读取其他事务已经提交的数据,可以防止脏读,可能出现不可重复读和幻读。

                                                      4. REPEATABLE_READ :  读取的数据被添加锁,防止其他事务修改此数据,可以防止脏读,不可重复读,可能出现幻读。

                                                      5. SERIALIZABLE  :   排队操作,对整个表添加锁,一个事务在操作数据时,另一个事务得等当前事务操作完成以后才能进行操作,(相当于对整个表得封锁!) 最安全,效率最低!

 

 

 

5rollback-for="异常类型全限定路径"

                                           5.1 当出现什么异常时需要进行回滚 ,建议: 手动抛异常时一定给出该属性的值!;

6、no-rollback-for=" "

                                            6.1 : 当出现什么异常时 不会滚事务!

 

 

 

 

三:Spring 中的常用注解

 

1、  @Component   创建类的对象,相当于配置 <bean/>

 

2、  @Service   于@Component 功能相同, 但是是写在 ServiceImpl 类上的.

 

3、 @Repository 与 @Component 功能相同。 但是是写在数据访问层上的。

 

4、 @Controller 与 @ Component 功能相同, 但是写在控制器类上。

 

5、@Resource (不需要写对象的   get/set   方法)  jdk提供的注解

                                                                       5.1  默认按照 byName注入,如果没有对象名称,则按照 byType 注入!

                                                                       5.2 建议把对象名称和Spring 容器中的对象名相同。

6、Autowired(不需要写对象的   get/set   方法)      Spring提供的注解 

                                                                       6.1   默认按照 byType 注入

 

 

 

7、@Value ()  获取properties文件中的内容。

      @ Pintcut() 定义切点,

      @ Aspect() 定义切面类

      @Before() 前置通知

      @After() 后置通知

      @AfterReturning 后置通知,必须切点正确执行

      @AfterThrowing 异常通知

      @ Arround  环绕通知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值