spring @Transactional注解用于事务回滚案例

spring @Transactional注解用于事务回滚案例spring @Transactional注解用于事务回滚案例

大家好,又见面了,我是你们的朋友全栈君。

这里基于小编的这篇博文的spring配置和实体类,service类为基础,解释@Transactional注解:

https://blog.csdn.net/csdnliuxin123524/article/details/80935836

注意这里@Transcational注解起作用的前提是要使用spring的声明式事务:

  <!-- 配置声明式事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

 上面的配置在之前的博文中有配置过。

package redisCache.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import redisCache.entity.User;
import redisCache.mapper.UserMapper;
import redisCache.service.UserService;

/**
 * Created by jiangfeixiang on 2018/4/27
 */
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
    //注入userMapper
    @Autowired
    private UserMapper userMapper;

    /**
     * 添加用户
     */
    @Override
    public void insertUser(User user){
        userMapper.insertUser(user);
        System.out.println("-------------");
        String string  = null;
   	    if(string.equals("")) {
   	        int i = 0;
   	    }
    }    
    
}

上面的代码我们在类上加上了transactional注解,方法中有一个插入的数据的方法,然后是故意做一个异常,让事务回滚。

测试类:

package redisCache;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import redisCache.entity.User;
import redisCache.service.UserService;
public class TestTransactional {
	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService userService=(UserService) applicationContext.getBean("userService");
    	User u=new User();
    	u.setId(1);
    	u.setUsername("xiaoming");
    	userService.insertUser(u);
    	
	}

}

然后运行测试类,最好debug运行,当走完service方法的插入到数据库操作时,你到数据库看,会发现数据库并没有插入数据。继续往下走就会抛出异常,数据库始终没有数据,保存也就没有成功。如果把service注解去掉,就会看到及时报异常,数据库也保存成功了。

在实际工作中我们更多的是遇到有多个关联的表都需要保存,很明显,为了保证事务的原子性,这些保存要么全部成功,要么全部失败。此时我就想到与要报这些保存都放在一个service方法中,如下:

 public void insertUser(User user){
        userMapper.insertUser(user);
        User user2=new User();
        user2.setId(2);
        user2.setUsername("xiaohua");
        userMapper.insertUser(user2);
        User user3=new User();
        user3.setId(2);
        user3.setUsername("xiaohua");
        userMapper.insertUser(user3);
        System.out.println("-------------");
        String string  = null;
   	    if(string.equals("")) {
   	        int i = 0;
   	    }
    }

上面的user,user2,user3保存就相当于有多个事务,这些事务在遇到下面的异常时,就会全部回滚,从而保证了事务的原子性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106062.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言里怎么设立优先级,细说C语言优先级

    c语言里怎么设立优先级,细说C语言优先级0.为什么要掌握优先级想想这两个问题:a.读别人的代码,遇到优先级问题看不懂,怎么办?b.一堆的括号,美观吗?本想贴一张画来装饰墙壁,却用了一堆纸来固定!有人说代码写多了,自然就会了。这个是很宽泛的说法。看你写的代码的水准,有些东西可能你一直都接触不到,何谈熟练。有些东西一定要梳理,总结。1.优先级1.1优先级图表优先级最高者不是真正意义上的运算符,包括:数组下标,函数调用,结构体成员…

    2022年6月16日
    28
  • servlet异步请求

    servlet异步请求1、什么是servlet异步请求Servlet3.0之前,一个普通Servlet的主要工作流程大致如下:(1)、Servlet接收到请求之后,可能需要对请求携带的数据进行一些预处理;(2)、调用业务接口的某些方法,以完成业务处理;(3)、根据处理的结果提交响应,Servlet线程结束。其中第二步处理业务逻辑时候很可以碰到比较耗时的任务,此时servlet主线程会阻塞等待完成业务处理,对于并发比较大的请求可能会产生性能瓶颈,则servlet3.0之后再此处做了调整,引入了…

    2022年7月27日
    1
  • 微信小程序跳转传值(微信怎样打开小程序)

    前情:首先我们有这么一种需求,就是我在一个列表中点击了某个item,跳转到详情界面,那么我就需要把item的实体数据从列表页面传递到详情页面,那么我们来看看微信小程序给我们提供的API:先看api:这里大家可以清楚看到api中说到的如何传递参数,其实它这里指的参数仅仅是一些普通的数据类型具体分析:这里我们要传递的实体是object类型,那么我们需要先把实体转…

    2022年4月12日
    49
  • dumpbin用法

    dumpbin用法转自:http://www.cnblogs.com/lidabo/p/3482dumpbin用法:dumpbin/exports/out:d:\mfc90.txtd:\mfc90.lib在使用VC时,可以用DUMPBIN.EXE来得到某个DLL中所输出的符号的清单。如下面的命令:dumpbin-exportsCmpnt1.dll如:C:\WINDOWS\syste…

    2022年6月19日
    28
  • Vue 分页器组件[通俗易懂]

    Vue 分页器组件[通俗易懂]<template><divclass=”pagination”><button>上一页</button><button@click=”changecurentpage(1)”v-if=”startEnd.start>1″>1</button><buttonv-if=”startEnd.start>2″>···</button><.

    2022年9月30日
    0
  • 天合光能与阿里云合作取得阶段性成果「建议收藏」

    天合光能与阿里云合作取得阶段性成果

    2022年3月12日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号