1-6SpringBoot之事务管理@Transactional
以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作;
用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败;
springboot下的话 搞一个@Transactional即可;
我们这里搞一个实例,转账实例,A用户转账给B用户xx元
设计如下:
Account类
import javax.persistence.Column;
import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="t_account")public class Account { @Id @GeneratedValue private Integer id; @Column(length=50) private String userName; private float balance; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public float getBalance() { return balance; } public void setBalance(float balance) { this.balance = balance; } }id 编号 userName用户名 balance余额
运行启动类,数据库里我们加两个数据

新建AccountDao接口
import org.springframework.data.jpa.repository.JpaRepository;
import com.java1234.entity.Account;/** * 账户Dao接口 * @author user * */public interface AccountDao extends JpaRepository<Account, Integer>{}/**
* 帐号Service接口 * @author user * */public interface AccountService { public void transferAccounts(int fromUser,int toUser,float account);}import javax.annotation.Resource;
import javax.transaction.Transactional;import org.springframework.stereotype.Service;import com.java1234.dao.AccountDao;import com.java1234.entity.Account;import com.java1234.service.AccountService;/** * 帐号Service实现类 * @author user * */@Service("accountService")public class AccountServiceImpl implements AccountService{ @Resource private AccountDao accountDao; public void transferAccounts(int fromUserId, int toUserId, float account) { Account fromUserAccount=accountDao.getOne(fromUserId); fromUserAccount.setBalance(fromUserAccount.getBalance()-account); accountDao.save(fromUserAccount); // fromUser扣钱 Account toUserAccount=accountDao.getOne(toUserId); toUserAccount.setBalance(toUserAccount.getBalance()+account); accountDao.save(toUserAccount); // toUser加钱 } }import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.java1234.service.AccountService;/** * 账户Controoler类 * @author user * */@RestController@RequestMapping("/account")public class AccountController { @Resource private AccountService accountService; @RequestMapping("/transfer") public String transferAccounts(){ try{ accountService.transferAccounts(1, 2, 200); return "ok"; }catch(Exception e){ return "no"; } }}我们执行启动类
浏览器输入:http://localhost:8888/account/transfer
运行OK

OK 我们先把数据恢复到700 300
现在我们把service层方法改下

这时候 扣钱dao能执行成功 加钱操作执行不了了 因为前面会报错。
我们重启启动类
浏览器输入:http://localhost:8888/account/transfer
运行NO

这时候 钱扣了 但是 没加钱 导致了数据不一致性
这时候 我们需要用上事务
在service方法上加上@Transactional即可

我们恢复下数据700 300
然后再重启启动类,
浏览器输入:http://localhost:8888/account/transfer
运行NO
但是数据库数据没变化 说明启动作用了。
1-6SpringBoot之事务管理@Transactional的更多相关文章
- sping 对 hibernate进行事务管理--Annotation, xml, 大多数使用XML
1. UserServiceTest.java: package com.bjsxt.service; import org.junit.Test; import org.springframewor ...
- spring05-Spring事务管理
事务的第一个方面是传播行为(propagation behavior).当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的 ...
- SpringBoot事务管理
1.在UserMapper接口中添加更新和删除方法 package com.cppdy.mapper; import org.apache.ibatis.annotations.Delete; imp ...
- java版云笔记(七)之事务管理
事务管理 事务:程序为了保证业务处理的完整性,执行的一条或多条SQL语句. 事务管理:对事务中的SQL语句进行提交或者回滚. 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...
- Spring -- spring结合aop 进行 tx&aspectj事务管理配置方法
1. tx 配置方法, 代码示例 javabean及其映射文件省略,和上篇的一样 CustomerDao.java, dao层接口 public interface CustomerDao { pub ...
- Spring ( 五 )Spring之数据访问与事务管理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Spring之数据访问 1.Spring数据访问工程环境搭建 jdbc.properties配置 ...
- 阿里面试挂了,就因为面试官说我Spring 事务管理(器)不熟练?
前言 事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一.但除了八股文中需要熟读并背诵的那些个传播行为之外,背后的"为什么"和核心原理更为重要. 写这篇文章之前,我 ...
- Spring声明式事务管理基于@Transactional注解
概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解. 第一种方式我已在上文为大 ...
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...
随机推荐
- .hpp 文件
.hpp 是 Header Plus Plus 的简写,是 C++程序头文件. 其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp ...
- Git基本指令
Git学习笔记 git //检查git是否安装 sudo apt-get install git git config --global user.name "dzq" git c ...
- UIScrollView学习指南
--前言 笔者结合自己的工作经验,梳理关于UIScrollView究竟需要掌握哪些知识才算是一个好手.至于具体的实施方案,网上资源很多,自行了解吧. --正文 1.涉及到滚动和放大的功能,优先考虑使用 ...
- selenium webdriver 模拟鼠标悬浮
/**模拟鼠标悬浮在某元素上 * @param driver * @param locator */ public static void moveToElement(WebDriver driver ...
- Unable to instantiate Action, xxxAction, defined for 'xxx' in namespace '/'xxxAction解决方案
出现这个问题的原因主要有两个 1.如果项目没有使用Spring,则struts.xml配置文件中,这个action的class属性的路径没有写完整,应该是包名.类名 2.如果项目使用了Spring,那 ...
- 16 JavaScript计时事件&显示时钟
计时事件:JavaScript设定一定的时间间隔之后来执行代码 window.setInterval("JavaScript function",millisecons):间隔指定 ...
- leetcode #980 不同路径||| (java)
在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格.且只有一个起始方格.2 表示结束方格,且只有一个结束方格.0 表示我们可以走过的空方格.-1 表示我们无法跨越的障碍.返回在四个方向 ...
- 【PAT甲级】1011 World Cup Betting (20 分)
题意: 给出三组小数,每组三个,分别代表一场比赛下注一块钱胜平负的赔率.输出投注的方案并计算投注两块钱期望收获.(赔率相乘后乘上0.65再减去本金2块钱) AAAAAccepted code: #in ...
- C++11通过拷贝构造器拷贝const字段(待解决)
问题梗概如标题所述. 在今天实现Token类的时候,遇到的问题. 我希望将Token类设定为immutable属性的,这样实现的方式是将这个类内的所有字段均设置为const型,同时每个字段均为publ ...
- 37 java序列化与反序列化
一.java序列化与反序列化 1.序列化: 是指把java对象转换为字节序列的过程: 2.反序列化:是指把字节序列恢复为java对象的过程. 二.为什么要序列化 我们知道,当两个进程进行远程通信时,可 ...