Spring的事务管理

一、简介

1、核心接口

1.1 PlatformTransactionManager:

Spring提供的平台事务管理器,主要用于管理事务。

该接口提供了三个方法:

  • TransactionStatus getTransaction(TransactionDefinition definition):用于获取事务状态,返回一个TransactionStatus对象,TransactionStatus对象表示一个事务,被关联在当前执行的线程上
  • void commit(TransactionStatus status):提交事务
  • void rollback(TransactionStatus status):回滚事务

PlatformTransactionManager接口只是代表事务管理的接口,不需要知道底层是如何管理事务,只需要事务管理提供上面三个方法,具体如何实现事务由它的实现类来完成。

PlatformTransactionManager有很多不同的实现类,常见的实现类如下:

  • org.springframework.jdbc.datasource.DataSourceTransactionManager:配置JDBC数据源的事务管理器
  • org.springframework.orm.Hibernate4.HibernateTransactionManager:配置Hibernate的事务管理器
  • org.springframework.transaction.jta.JtaTransactionManager:配置全局事务管理器
    当底层采用不同的持久层框架时,系统只需要使用不同的PlatformTransactionManager实现类即可

1.2 TransactionDefinition:

在这里插入图片描述

1.3TransactionStatus

在这里插入图片描述

2、事务管理的方式:

  • 编程序事务管理:通过编写代码实现事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚
  • 声明式事务管理:通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”植入到业务目标类中

声明式事务管理最大的优点在于开发者无须通过编程的方式来管理业务,只需要在配置文件中进行相关的事务规则声明,就可以将事务规则应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少工作量,提高了开发效率。所有在实际开发中,通常都推荐使用声明式事务管理。

二、基于xml方式的声明式事务

Spring2.0以后,提供了tx命名空间来配置事务,tx命名空间下提供了< tx:advice>元素来配置事务的通知。当使用< tx:advice>元素配置了事务的增强处理后,就可以通过编写的AOP配置让Spring自动对目标生成代理。
配置< tx:advice>元素,通常需要指定id和transaction-manager属性,其中id是配置文件中的唯一标识,transaction-manager属性用于指定事务管理器。除此之外,还需要配置一个< tx:attributes>子元素,该子元素可通过配置多个< tx:method>子元素来配置执行事务的细节。

关于< tx:method>元素的属性描述如下:

  • name:必须属性,指定与事务属性相关的方法名。其属性名支持使用通配符,如’ * '、'get * '等
  • propagation:指定事务的传播行为,属性值为1.2的表
  • islation:用于指定事务的隔离级别,属性值为1.2的表
  • read-only:指定事务是否只读,默认值为false
  • timeout:指定事务超时时间,默认值为-1,即永不超时
  • rollback-for:指定触发事务回滚的异常类,在指定多个异常类时,异常类直接以英文逗号分隔
  • no-rollback-for:指定不触发事务回滚的异常类,在指定多个异常类时,异常类直接以英文逗号分隔

使用:

1、导包和配置文件

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.13</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.13</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.13</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

        <dependency>
            <groupId>aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.5.4</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
    </dependencies>


    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

2、创建实体类

@Data
public class User {

    private int id;
    private String name;
    private String pwd;
}

3、创建dao接口和实现类

public interface UserMapper {

    List<User> selectUser();
}
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{

	//实现业务
    @Override
    public List<User> selectUser() {
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        return mapper.selectUser();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.mapper.UserMapper">

    <select id="selectUser" resultType="user">
        select * from mydatabase.user
    </select>

	<!--可以在这里增加自己需要使用的增删改查业务-->
</mapper>

4、applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydatabase?"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/study/mapper/*.xml"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

    <bean id="userMapper" class="com.study.mapper.UserMapperImpl">
        <property name="SqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

</beans>

mybatis-cofig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <typeAliases>
       <package name="com.study.pojo"/>
   </typeAliases>


</configuration>

5、测试:

public class test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
        for (User user : userMapper.selectUser()) {
            System.out.println(user);
        }
    }
}

结果
在这里插入图片描述

三、基于Annotation方式的声明式事务

1、在Spring容器中注册事务注解驱动

<tx:annotation-driven transaction-managers ntransactionManager"/>

2、在需要使用事务的Spirng Bean类或者Bean类的方法上添加注解@Transactional。

  • 如果添加在Bean类上,就表示事务的设置对整个Bean类的所有方法都起作用
  • 如果添加在Bean类中的某个方法上,就表示事务的设置只对该方法有效

@Transactional注解的参数:

  • value:用于指定需要使用的事务管理器,默认为"",别名为transactionManager
  • transactionManager:指定事务的限定符值,可用于确定的目标是无管理器,匹配特定的限定值(或者Bean的name值),默认为"",别名为value
  • isolation:指定事务的隔离级别,默认为Isolation.DEFAULT
  • noRollbackFor:指定遇到特定异常时强制不回滚
  • noRollbackForClassName:用于指定遇到特定的多个异常时强制不回滚事务
  • propagation:指定事务的传播行为,默认为Propagation REQUIRED
  • read-only:指定事务是否只读,默认为false
  • rollbackFor:指定遇到特定异常时强制回滚事务
  • rollbackForClassName:指定遇到特定的多个异常时强制回滚事务
  • timeout:指定事务的超时时常,默认为TransactionDefinition.TIMEOUT_DEFAULT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值