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


相关推荐

  • 如何添加smtp服务器_smtp服务器设置

    如何添加smtp服务器_smtp服务器设置在现在这个时代中,人们传输信息基本上都是用邮件传输,那么你知道电脑之间是怎么用邮件传输的么。就是通过smtp服务器,通过这个服务器,人们可以把自己写的东西通过邮件经过这个服务器传输到你想让邮件传输到的地方,接下来就让小编好好给大家介绍一下。Smtp传输器是什么?Smpt的意思是简单的邮件传输协议,它是一组用于源地址到目的地传送邮件的规则,并且由它决定邮件的中转方式。Smtp传输器使用由tcp提供的…

    2022年9月1日
    1
  • 李开复:人工智能时代怎样才不会被取代_李开复关于人工智能的演讲

    李开复:人工智能时代怎样才不会被取代_李开复关于人工智能的演讲提起“人工智能”你会想到什么?  是欧美大片里战无不胜、技能完备的人形机器人? 还是与柯洁等围棋名将上演惊世对决的AlphaGo?事实上人工智能并没有那么遥远 “比爱人还爱你”的手机…… 你每天晨起打开的电子新闻报…… 自动驾驶汽车或翻译软件…… 人工智能早已渗透在我们生活的每一个角落——它,无处不在。

    2022年9月29日
    0
  • 页面自动跳转的两种常用方法

    页面自动跳转的两种常用方法

    2021年7月2日
    87
  • 深入koa2源码

    深入koa2源码

    2021年6月19日
    108
  • pycharm教育版申请_pycharm专业版学生免费吗

    pycharm教育版申请_pycharm专业版学生免费吗前提准备:已经下载安装好了PyCharm专业版如果你还没下载,也别方张~嘻嘻嘻点击下面

    2022年8月26日
    3
  • 三星一万多的翻盖手机叫什么_华为nex双屏

    三星一万多的翻盖手机叫什么_华为nex双屏三星用翻盖机怀念过去。哪怕国内市场份额不足1%,三星也要在新品发布会上用“逼格”力压群芳。11月9日,刚在旧金山用折叠手机吸引了不少目光的三星,在无锡和中国联通发布了针对成功商务人士的新机——三星W2019。开场,三星就扔出了钢琴演奏家马克西姆、男高音歌唱家戴玉强两张“格调十足”的王牌。场内“野蜂”与美声齐飞,场外美女与骏马亮相。…

    2022年8月10日
    3

发表回复

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

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