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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • arcgis二次开发python-ArcGIS 二次开发专题 序「建议收藏」

    arcgis二次开发python-ArcGIS 二次开发专题 序「建议收藏」依据ArcGIS组件式开发及应用的目录结构,将系统性的学习ArcGIS二次开发的道路分为三个部分。这个系列包含以下三个部分:Part1基础1.前言1.1组件式GIS1.2ArcObject开发的特点与历史2.使用ArcGISEngine控件编程3.几何形体对象Geometry4.地图组成5.空间数据符号化6.空间数据管理7.空间分析8.空间数据编辑9.地图输出10…

    2022年7月23日
    11
  • .net AutoEventWireup介绍

    .net AutoEventWireup介绍ASP.NET页会引发诸如Init、Load、PreRender等生命周期事件。默认情况下,可以使用Page_事件名称的命名约定将页事件绑定到方法。例如,若要为页的Load事件创建处理程序,可以创建名为P…

    2022年5月28日
    34
  • scrum okr_Scrum方法

    scrum okr_Scrum方法OKR与Scrum如何强强联手

    2022年4月21日
    43
  • slam技术前景_技术市场的概念

    slam技术前景_技术市场的概念SLAM技术与市场杂谈

    2022年10月1日
    3
  • python中griddata的外插值_griddata二维插值[通俗易懂]

    python中griddata的外插值_griddata二维插值[通俗易懂]”””SimpleN-Dinterpolation..versionadded::0.9″””##Copyright(C)PauliVirtanen,2010.##DistributedunderthesameBSDlicenseasScipy.###Note:thisfileshouldberunthroughtheMakotemplateen…

    2022年5月9日
    293
  • 常用进程调度算法_进程调度算法例题

    常用进程调度算法_进程调度算法例题写在前面:我是【程序员宝藏】的宝藏派发员,致力于创作原创干货。我热爱技术、热爱开源与分享,创作的【计算机基础面试问题】系列文章和【计算机基础主干知识】系列文章广受好评!后期会创作更多优质原创系列文章!如果您对计算机基础知识、编程等感兴趣,可以关注我,我们一起成长!本人力荐:如果觉得CSDN排版不够美观,欢迎来我的个人原创公zong号【程序员宝藏】(号如其名,诚不欺你!)查看有红色重点标记和排版美观的全系列文章(不细你来找我要红包)参考链接:TCP三次握手四次挥手好多同学问我要pdf版,我干脆.

    2022年9月29日
    3

发表回复

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

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