Spring声明式事务管理

1.注入依赖

 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2.事务的详细说明

2.1什么是事务

通俗来讲就是一些事情的只能同时完成,获取同时不完成,比如银行转账功能,自己账户往别人账户赚钱,自己钱减少,别人钱增加,这两件事必须同时成功和失败。

2.2事务的四个属性ACID

1、原子性(atomicity)
事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用
2、一致性(consistency)
一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中
3、隔离性(isolation)
可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
4、持久性(durability)
事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中

2. 3事务隔离级别和事务并发

并发问题:
脏读(dirty read):一个事务读到了另一个未提交的事务
不可重复读(non-repeatable read):一个事务中两次读同一行数据,可是这两次读到的数据不一样
.幻读(phantom read):一个事务中两次查询,但第二次查询比第一次查询多了或少了几行或几列数据
事务隔离级别有4种:
1 - read-uncommitted
2 - read-committed
4 - repeatable read
8- serializable
一般使用第二种,即数据库的隔离级别。

3.声明式事务管理

1.加入事务管理,jdbcTemplate和aop的约束,本次案例使用了注解注入,所以添加了
xmlns:context="http://www.springframework.org/schema/context"

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd

        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
      <!--注解和aop需要的配置-->
     <context:component-scan base-package="com.spring"></context:component-scan>
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

2.注入jdbcTemplate和数据源。

 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="liuqing.1998"></property>
    </bean>

3.1配置事务管理器

	 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
             <property name="dataSource" ref="dataSource"></property>
    </bean>

3.2配置事务的通知

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
    </tx:advice>

3.3配置aop表达式和事务的关系

 <aop:config>
        <aop:pointcut id="pt1" expression="execution(* com.spring.service.impl.*.*(..))"></aop:pointcut>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
   </aop:config>

3.4配置事务的属性
在这里插入图片描述

<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
        <!--指定方法名:第一种通配,任意方法。第二种find方法才会执行
        	属性的详细配置参考上图。
		-->
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

4.测试
本案例使用了spring的test测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:bean.xml")
public class springtest {
    @Autowired
    private AccountService as;

    @Test
    public void test(){
        as.transfer("bbb","aaa",100);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值