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. ...
随机推荐
- C - Water The Garden
It is winter now, and Max decided it's about time he watered the garden. The garden can be represent ...
- ArrayList、Vector和LinkedList
List接口特点 1.有序的 collection. 2.可以对列表中每个元素的插入位置进行精确地控制. 3.可以根据元素的索引访问元素,并搜索列表中的元素. 4.列表通常允许重复的元素. 5.允许存 ...
- 【网摘】监控 div 的内容变化
数据是动态加载而来,而当无数据时,提示一下暂无数据.而数据是可以动态在当前页面即时添加的,故在无数据时所做提示,需要隐藏,所以找了这个方法.成功在动态添加数据后,暂无数据的提示没有了. if($(&q ...
- uniGUI之uniEdit(23)
主要新加属性: a]EmptyText在没有文本里显示的背景文本. b]作为其他控件的编辑输入控件. c]ClearButton清空按钮 d]左边显示文本 e]回车触发事件CharEOL:=#13 f ...
- 08 DTFT变换的性质
DTFT变换的性质 线性性质 设 \[ x[n]\xrightarrow{DTFT}X(e^{jw})\quad y[n]\xrightarrow{DTFT}Y(e^{jw}) \] 则 \[ \ ...
- C/C++ scanf和gets 区别 , printf和puts区别
ref 1. scanf和gets区别 | 博客园 2. printf和puts区别 | CSDN scanf和gets都能从输入流stdin读取字符串,那么它们有什么区别呢? scanf 留回车:开 ...
- day5-1继承
继承: Constructor属性和prototype属性的关系: 创建了自定义的构造函数之后,其原型对象默认会取得constructor属性:当调用构造函数创建一个新实例后,该实例的内部将包含一个指 ...
- swoole 监控文件改动
<?php /** * 场景: * 进程监控文件改动 */ date_default_timezone_set('PRC'); echo '进程id:' . posix_getpid() . P ...
- 科普:为什么 String hashCode 方法选择数字31作为乘子
作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...
- springboot 重写 AuthorizationFilter
原文链接:https://www.cnblogs.com/zeussbook/p/10778532.html