首页 > 其他分享 >Spring事物

Spring事物

时间:2023-08-17 09:45:44浏览次数:34  
标签:事务 spring Spring 事物 id money org public

一、什么是事务?

事务:一系列执行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);
    }
}

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

标签:事务,spring,Spring,事物,id,money,org,public
From: https://www.cnblogs.com/xbf3910/p/17636624.html

相关文章

  • SpringBoot3集成RocketMq
    标签:RocketMq5.Dashboard;一、简介RocketMQ因其架构简单、业务功能丰富、具备极强可扩展性等特点被广泛应用,比如金融业务、互联网、大数据、物联网等领域的业务场景;二、环境部署1、编译打包1、下载5.0版本源码包rocketmq-all-5.0.0-source-release.zip2、解压后进入目录,......
  • java Sping aop 以及Spring aop 的应用事务管理
    1.回顾线程死锁概念和如何避免死锁的发生:线程的通信waitnotify()notify():---Object类线程的状态:NEW--->start()--->就绪状态---CPU时间片---运行状态RUNNABLE]--->sleep()--->TIMED_WAITING--->wait()---->WAITING----sysn---Blocked---->终止状态[T]线程池:常见......
  • 一个新的springboot框架-COLA
    新来个技术总监,给公司项目引入了全新的业务架构,堪称最佳实践!(qq.com)......
  • 详谈 springboot整合shiro
    背景:上文学习了shrio基本概念后,本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解。 利用Shiro进行登录认证主要步骤:1.添加依赖:首先,在pom.xml文件中添加SpringBoot和Shiro的相关依赖。<!--SpringBoot--><dependency><groupI......
  • SpringBoot项目统一处理返回值和异常
    目录简介前期准备统一封装报文统一异常处理自定义异常信息简介当使用SpringBoot开发Web项目的API时,为了与前端更好地通信,通常会约定好接口的响应格式。例如,以下是一个JSON格式的响应,通过返回码和返回信息告知前端具体的操作结果或错误信息。如果操作成功,前端可以通过"data"字段......
  • javaSpring之AOP
    1.什么是AOP翻译中文为:面向切面编程,可以让你在业务代码与非业务代码隔离,增加新的非业务代码2.AOP使用场景1.我一直遵循着存在即合理的观念,在各大需求中,有一种需求是每当操作时,就会在数据库记录日志,那么在不更改业务代码的情况下应该怎么做,没错,AOP可以解决2.当然,其也可以做权限......
  • SpringBoot3.x 启动 refresh 过程解析
    Spring容器创建后,会调用它的refresh方法,refresh的时候会做很多事情:如完成配置类解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。web程序对应Spring容器为AnnotationConfigServletWebServerApplicationContext。Servlet......
  • Spring Security - authorization
    前面我们弄好了认证,授权就是在认证的基础之上授权只有用户认证了才可能有授权,授权就是当前用户能干什么UserDetailServiceImpl //之前我们只是在这里将用户的一些基本信息封装了,但是我们要授权的话需要角色信息和权限信息 //TODO添加持久层的代码获取当前用户的角色和权......
  • Spring Security - authentication
    前言:SpringSecurity是Spring家族中的安全框架,主要功能有两个认证(authentication)授权(authorization)认证认证核心过滤器链流程图前端发送请求AuthenticationFilter拦截请求调用UsernamePassowordAuthenticationTokenUsernamePassowordAuthenticationToken将前端发送的表......
  • spring注入bean错误-Bean named 'abc' is expected to be of type 'AAA' but was actu
    先看如下两个注入到spring容器中的bean,一个是UserNewManager,一个是UserManager。@ServicepublicclassUserNewManager{publicvoiddoSomething(){}}@ServicepublicclassUserManager{...}再看下面的testcase,利用@Resource注解来注入bean。@......