Spring-事务

什么是事务

访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败。

事务的特性

1)原子性
2)一致性
3)隔离性
4)持久性

注解声明式事务管理


配置Spring配置文件

    <!--引入外部属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"/>
        <property name="url" value="${prop.url}"/>
        <property name="username" value="${prop.userName}"/>
        <property name="password" value="${prop.password}"/>
    </bean>

 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 <!--开启事务注解-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
prop.driverClass=com.mysql.cj.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
prop.userName=root
prop.password=123456
#jdbc.properties配置文件



事务传播:https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#tx-propagation

XML声明式事务管理

Spring配置文件

  <!--引入外部属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"/>
        <property name="url" value="${prop.url}"/>
        <property name="username" value="${prop.userName}"/>
        <property name="password" value="${prop.password}"/>
    </bean>

    <!--开启事务注解-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置通知-->
    <tx:advice id="txadvice">
    <!--配置事务参数-->
        <tx:attributes>
            <!--指定哪种规则的方法上面添加事务,默认是REQUIRED-->
            <tx:method name="transfer"/>
         </tx:attributes>
    </tx:advice>>

    <!--3 配置切入点和切面--> 
    <aop:config>
        <!--配置切入点-->
       <aop:pointcut id="pt" expression="execution(* com.fly.spring5.service.TransactionDemoDaoService.*(..))"/>
            <!--配置切面-->
       <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
    </aop:config>

纯注解

package com.fly.spring5.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@ComponentScan(basePackages = {"com.fly"})
@EnableTransactionManagement
@EnableAspectJAutoProxy//这个不用
public class MyConfig {
  //创建数据库连接池
  @Bean
  public DruidDataSource getDruidDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8" +
            "&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true");
    dataSource.setUsername("root");
    dataSource.setPassword("123456");
    return dataSource;
  }

  @Bean
  public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate();
    jdbcTemplate.setDataSource(dataSource);
    return jdbcTemplate;
  }

  //创建事务管理器
  @Bean
  public DataSourceTransactionManager
  getDataSourceTransactionManager(DataSource dataSource) {
    DataSourceTransactionManager transactionManager = new
            DataSourceTransactionManager();
    transactionManager.setDataSource(dataSource);
    return transactionManager;
  }

}

更多的看官网:https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#transaction-strategies

posted @ 2021-11-06 16:57  翻蹄亮掌一皮鞋  阅读(52)  评论(0)    收藏  举报