Spring事物

发布时间 2023-08-17 09:39:43作者: 蝶凌天

一、什么是事务?

事务:一系列执行SQL语句的操作,它被当作一个单独的工作单元,这些操作要么全部完成,要么全部不起作用。

二、事务的四大特征

1、原子性(Atomicity)
一个事务是不可分割的最小工作单位
执行事务,要么全部成功,要么回滚到执行事务之前的状态。
2、一致性(Consistency)
事务执行前后的数据,必须保持一致
3、隔离性(Isolation)
多个事务之间数据要相互隔离,彼此独立和透明互不影响
4、持久性(Durability)
事务一旦提交,数据的改变是永久性的

三、Spring如何实现事务

(1)引入依赖

<!--  Spring 依赖  -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.15.RELEASE</version>
    </dependency>
    <!--引入SpringAop 依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.15.RELEASE</version>
    </dependency>
      <!--Mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.12.RELEASE</version>
    </dependency>
    <!--spring事务依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.12.RELEASE</version>
    </dependency>
     <!--jdbc依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.15.RELEASE</version>
    </dependency>

    <!--mybatis的依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.9</version>
    </dependency>
    <!--mybatis和spring整合的依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.7</version>
    </dependency>
    <!--druid的连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.28</version>
    </dependency>

(2)配置Spring文件

      <!--开启Aop切面注解驱动-->
    <aop:aspectj-autoproxy/>

    <!--springmvc的配置-->
    <!--包扫描 扫描com.ykq以及该包下的子包-->
    <context:component-scan base-package="com.deom.dome5"/>
    
    <!--spring整合mybatis的配置-->

    <!--数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <!--mysql驱动为8.0以后必须使用时区-->
        <property name="url" value="jdbc:mysql://localhost:3306/aaa?serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--spring封装了一个类SqlSessionFactoryBean类,可以把mybatis中的配置-->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:/mapper/*.xml"/>
    </bean>

    <!--为指定dao包下的接口生产代理实现类-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
        <!--它会为com.ykq.dao包下的所有接口生产代理实现类-->
        <property name="basePackage" value="com.ykq.dao"/>
    </bean>

    <!---================以下内容是关于事务的配置===================-->
    <!--事务切面管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--开启事务管理注解的驱动-->
    <tx:annotation-driven/>

(3) dao和xml

public interface UserDao {
    // 1.修改账号余额
    public void updateBlance(@Param("id") int id, @Param("money") double money);
}
<mapper namespace="com.xwb.dao.UserDao">
    <update id="updateBlance">
        update tbl_user set money=money+#{money} where id=#{id};
    </update>
</mapper>

(4) service

@Service
public class UserServiceImpl implements UserService {
    @Autowired
   private UserDao userDao;
    @Transactional  //该方法交于spring的事务以此管理,默认spring不识别这个注解,只有开启 <tx:annotation-driven/> 事务管理驱动
    public void updateBlance(int id, int uid, double money) {
        // 1.扣钱
        userDao.updateBlance(id,-money);
        // 2.加钱
        userDao.updateBlance(uid,money);
    }

}

(4)测试

public class Text1 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        UserService userServiceImpl = (UserService) context.getBean("userServiceImpl");
        userServiceImpl.updateBlance(14,15,200);
    }
}

如果出现报异常,数据库的金额不会改变,无异常则反之。