数据源dataSource以及事务tx的xml文件配置方式及代码配置方式

所需要使用的依赖
<dependencies>
    <!--spring jdbc  Spring 持久化层支持jar包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>6.0.2</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
    <!-- 数据源 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.15</version>
    </dependency>
</dependencies>

一、xml文件配置方式

1、连接到数据库创建jdbc.properties文件并配置以下信息

//(需要MySQL 8.0及以上版本)
jdbc.user=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8&useSSL=false
jdbc.driver=com.mysql.cj.jdbc.Driver

2、创建xml文件

<!-- 导入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  <property name="username" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="driverClassName" value="${jdbc.driver}"/>
  <property name="url" value="${jdbc.url}"/>
</bean>

<!-- 配置事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource">
</bean>
<!--
    开启事务的注解驱动
    通过注解@Transactional所标识的方法或标识的类中所有的方法,都会被事务管理器管理事务
-->
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- 配置事务管理,此配置添加后不需要 <tx:annotation-driven/> 标签-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx: method name="get*" readonly="true"/>         <!-- 设置需要添加事物的方法,并设置为仅能进行查找操作。 -->
    <tx:method name="query*" read-only="true"/>
    <tx:method name="find*" read-only="true"/>

    <!-- read-only属性:设置只读属性 -->
    <!-- rollback-for属性:设置回滚的异常 -->
    <!-- no-rollback-for属性:设置不回滚的异常 -->
    <!-- isolation属性:设置事务的隔离级别 -->
    <!-- timeout属性:设置事务的超时属性 -->
    <!-- propagation属性:设置事务的传播行为 -->

    <tx:method name="save*" readonly="false"/ rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/>   <!-- 此处也可使用自定义异常。mysql中REQUIRES_NEW为默认传播行为 -->
    <tx:method name="update*" read-only="false" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/>
    <tx:method name="delete*" read-only="false" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/>
  </tx:attributes>
</tx:advice>
  • TODO: 基于xml实现的声明式事务(需要事务管理时)或添加aop时,需要引入aspectJ依赖
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aspects</artifactId>
     <version>6.0.2</version>
</dependency>
  • 在进行持久化操作方法上方加上@Transaction注解从而完成事务操作

二、全注解配置方式

  • 创建配置类
@Configuration
@EnableTransactionManagement
@EnableAspectJAutoProxy  //开启aspect aop注解支持,通过@Transaction进行事务管理需要添加上
@ComponentScan("所扫描的包的路径")
class ServiceConfig{
  @Bean
  public DataSource dataSource(){
    DataSource dataSource = new DataSource();
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8&useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
  }

  @Bean
  public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
  }

    //对数据库进行增、删、改、查、插的两种方式
    //1、使用jdbcTemplate操作数据库
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }
}
    //2、使用Mybatis操作数据库配置

使用Mybatis操作数据库配置

拓展

三、@Transaction的用法,通过@Transactional中相关属性实现事务管理

1、回滚策略

  • 碰到某类异常进行回滚
    • rollbackFor属性:需要设置一个Class类型的对象
    • rollbackForClassName属性:需要设置一个字符串类型的全类名
  • 碰到某类异常不回滚
    • noRollbackFor属性:需要设置一个Class类型的对象
    • rollbackFor属性:需要设置一个字符串类型的全类名

使用方式

@Transactional(rollbackFor = ArithmeticException.class)
@Transactional(noRollbackForClassName = "java.lang.ArithmeticException")

2、隔离级别

使用方式

@Transactional(isolation = Isolation.DEFAULT)//使用数据库默认的隔离级别
@Transactional(isolation = Isolation.READ_UNCOMMITTED)//读未提交
@Transactional(isolation = Isolation.READ_COMMITTED)//读已提交
@Transactional(isolation = Isolation.REPEATABLE_READ)//可重复读
@Transactional(isolation = Isolation.SERIALIZABLE)//串行化

3、传播行为

  • REQUIRED:如果当前存在事务,则加入到当前事务中;如果不存在就新建一个(默认)【没有就新建,有就加入】
  • SUPPORTS:如果当前存在事务,则支持当前事务;如果当前没有事务,就以非事务方式执行【有就加入,没有就不管了】
  • MANDATORY:必须运行在一个事务中,如果当前没有事务正在发生,将抛出一个异常【有就加入,没有就抛异常】
  • REQUIRES_NEW:总是创建一个新的事务,并且在新事务中执行,如果当前存在事务,则把当前事务挂起;【不管有没有,直接开启一个新事务,开启的新事务和之前的事务不存在嵌套关系,之前事务被挂起】
  • NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务【不支持事务,存在就挂起】
  • NEVER:以非事务方式运行,如果有事务存在,抛出异常【不支持事务,存在就抛异常】
  • NESTED:如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于外层事务进行提交或回滚,但如果外部事务回滚,嵌套事务也会被回滚。如果外层事务不存在,行为就像REQUIRED一样。【有事务的话,就在这个事务里再嵌套一个完全独立的事务,嵌套的事务可以独立的提交和回滚。没有事务就和REQUIRED一样。】
posted @ 2024-06-30 18:32  归颰  阅读(6)  评论(0编辑  收藏  举报