【Spring】 事务管理【8】声明式事务管理

事务管理

事务管理又分为两种

  1. 声明式事务管理
  2. 编程式事务管理

实现方式分为两种:

  1. 注解式
  2. 配置文件式

声明式事务管理

使用步骤

步骤1:配置Datasource以及JdbcTemplate

		<context:component-scan base-package="Day12"/>
        <context:property-placeholder location="db.properties"/>
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
                <property name="driverClassName" value="${jdbc.driver}"/>
        </bean>

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="dataSource"/>

        </bean>

步骤二:配置声明式事务管理Bean

(由于使用的是DataSource所以对应也应该选择Datasource)

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

并且开启注解式事务管理
(前提是引入tx名称空间)

		<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

步骤三:事务操作-应用@Transactional

所放位置:

  1. 类上
  2. 方法上

@Transactional的属性

propagation

表示:事务传播行为
意为:多事务方法直接进行调用,这个过程中事务是如何进行管理的。
事务方法: 增删改的方法)

取值:(还有五种)

1.REQUIRED

两种情况:

  1. 如果当前线程有事务在运行,当前方法就在这个事务内运行
  2. 如果当前线程没有事务在运行,就开启一个新的事务,并且在自己的事务内运行
2.REQUIRED_NEW

两种情况:

  1. 如果当前线程无事务的运行情况下,启动一个新事务
  2. 如果当前线程有事务的运行情况下,将其挂起
3.SUPPORTS

两种情况

  1. 如果当前线程无事务的运行情况下,则不会以事务去运行
  2. 如果当前线程有事务运行的情况下则会在该事务中运行
isolation

表示:事务的隔离级别

为了解决ACID中的隔离性

隔离性保证多事务操作之间不会相互影响。

相互影响的三个读的问题

  1. 脏读
  2. 不可重复读
  3. 虚读
    (并发环境下会发生)

脏读: 一个事务读取到另外一个未提交事务(以后回滚)的值

不可重复读: 事务前后多次读取同一数据的值不一致

虚读(幻读): 一个未提交事务读到另一提交事务未提交前的数据。

解决上述三个问题很像线程安全问题里面的上锁。

取值:

  1. DEFAULT 使用底层数据库默认的隔离级别
  2. READ_UNCOMMITTED 读取未提交数据(一个问题都解决不了)
  3. READ_COMMITTED 读取已提交数据 (解决脏读)
  4. REPEATABLE_READ 可重复读 (解决脏读和不可重复读(大概率幻读也不会有))
  5. SERIALIZABLE 串行化 (最安全,但是效率最低(给整个表上锁))

MySQL默认第四个,Oracle默认第三个

timeout

表示:超时时间
如果事务超过默认时间还没完成就自动回滚

readOnly

表示:是否只读
只读事务:值为true 或者 false

rollbackFor

表示:回滚
指定异常类型并且可以多个可以单个,发生这些异常的时候就回滚事务

norollbackFor

表示:不回滚
指定抛出这些异常的时候就不会回滚事务

基于XML配置文件方式实现(少用)

第一步:同样需要配置事务管理器

第二步:配置通知

		<tx:advice id="advice1">
                <tx:attributes>
                        <tx:method name="loginUser"/>
                        <!--加入事务的方法名-->
                        <tx:method name="login*"/>
                        <!--加入事务的login开头的方法名-->
                </tx:attributes>
        </tx:advice>

第三步:配置切入点

		<aop:config>
                <aop:pointcut id="pt" expression="execution(* Day12.service.UserService.*(..))"/>
                <aop:advisor advice-ref="advice1" pointcut-ref="pt"/>
        </aop:config>

通过配置类实现完全注解

配置Druid连接池

@Configuration
@ComponentScan(basePackages = "Day12")
@EnableTransactionManagement
public class TxConfiguration {

    //创建数据库连接池
    @Bean
    public DruidDataSource getDruidDataSource() throws IOException {
        DruidDataSource druidDataSource = new DruidDataSource();
        
        Properties properties=new Properties();
        properties.load(TxConfiguration.class.getClassLoader().getResourceAsStream("db.properties"));
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        
        return druidDataSource;
    }

}

配置JdbcTemplate

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

在这里插入图片描述
这里表示从IOC容器中找到对应的Bean,而不是重新创建一个

配置事务管理器

	@Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DruidDataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值