查看: 36|回复: 0
打印 上一主题 下一主题

[Spring] SpringBoot之事务管理@Transactional

[复制链接]
  • TA的每日心情
    开心
    2017-7-5 20:14
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    1698

    主题

    1707

    帖子

    7350

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7350
    跳转到指定楼层
    楼主
    发表于 4?天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一 添加依赖


    1. ? ?? ???org.springframework.boot
    2. ? ?? ???spring-boot-starter-data-jpa



    3. ? ?? ???mysql
    4. ? ?? ???mysql-connector-java
    5. ? ?? ???5.1.47



    6. ? ?? ???org.springframework.boot
    7. ? ?? ???spring-boot-starter-web
    复制代码

    二 添加实体类Account.java
    1. package com.transactional.test.entity;

    2. import org.hibernate.annotations.NotFound;
    3. import org.hibernate.annotations.NotFoundAction;

    4. import javax.persistence.*;

    5. @Entity
    6. @Table(name="t_account")
    7. public class Account {
    8. ? ? @Id
    9. ? ? private Integer id;
    10. ? ? private String userName;
    11. ? ? private float balance;

    12. ? ? public Integer getId() {
    13. ? ?? ???return id;
    14. ? ? }

    15. ? ? public void setId(Integer id) {
    16. ? ?? ???this.id = id;
    17. ? ? }

    18. ? ? public String getUserName() {
    19. ? ?? ???return userName;
    20. ? ? }

    21. ? ? public void setUserName(String userName) {
    22. ? ?? ???this.userName = userName;
    23. ? ? }

    24. ? ? public float getBalance() {
    25. ? ?? ???return balance;
    26. ? ? }

    27. ? ? public void setBalance(float balance) {
    28. ? ?? ???this.balance = balance;
    29. ? ? }
    30. }
    复制代码

    三 添加AccountDao.java
    1. package com.transactional.test.dao;

    2. import com.transactional.test.entity.Account;
    3. import org.springframework.data.jpa.repository.JpaRepository;

    4. public interface AccountDao extends JpaRepository {

    5. }
    复制代码

    四 添加服务接口AccountService.java
    1. package com.transactional.test.service;

    2. public interface AccountService {
    3. ? ? void transferAccounts(int fromUserId,int toUserId,float account);
    4. }
    复制代码

    五 添加接口实现AccountServiceImpl.java
    1. package com.transactional.test.service;

    2. import com.transactional.test.dao.AccountDao;
    3. import com.transactional.test.entity.Account;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. import org.springframework.transaction.annotation.Transactional;

    7. @Service
    8. public class AccountServiceImpl implements AccountService {

    9. ? ? @Autowired
    10. ? ? private AccountDao accountDao;

    11. ? ? @Override
    12. ? ? @Transactional
    13. ? ? public void transferAccounts(int fromUserId, int toUserId, float account) {
    14. ? ?? ???Account fromUserAccount=accountDao.getOne(fromUserId);
    15. ? ?? ???fromUserAccount.setBalance(fromUserAccount.getBalance()-account);
    16. ? ?? ???accountDao.save(fromUserAccount); // fromUser扣钱
    17. ? ?? ???Account toUserAccount=accountDao.getOne(toUserId);
    18. ? ?? ???toUserAccount.setBalance(toUserAccount.getBalance()+account);
    19. ? ?? ???//假设转账的时候假如出现异常,业务类或业务方法中没有使用@Transactional控制事务,则会出现钱转出了,收钱人没有收到的情况
    20. ? ?? ???int zero = 1/0;??//这里我们先把这个异常注释掉,稍后我们再打开
    21. ? ?? ???accountDao.save(toUserAccount); // toUser加钱
    22. ? ? }
    23. }
    复制代码

    六 添加访问层AccountController.java
    1. package com.transactional.test.controller;

    2. import com.transactional.test.service.AccountService;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.RestController;

    6. @RestController
    7. @RequestMapping("/account")
    8. public class AccountController {
    9. ? ? @Autowired
    10. ? ? private AccountService accountService;

    11. ? ? @RequestMapping("/transfer")
    12. ? ? public String transferAccounts(){
    13. ? ?? ???try{
    14. ? ?? ?? ?? ?accountService.transferAccounts(1,2,200);
    15. ? ?? ?? ?? ?return "ok";
    16. ? ?? ???}catch (Exception e){
    17. ? ?? ?? ?? ?return "no";
    18. ? ?? ???}
    19. ? ? }
    20. }
    复制代码

    七 添加运行类TestApplication.java
    1. package com.transactional.test;

    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;

    4. @SpringBootApplication
    5. public class TestApplication {

    6. ? ? public static void main(String[] args) {
    7. ? ?? ???SpringApplication.run(TestApplication.class, args);
    8. ? ? }

    9. }
    复制代码

    八 添加配置项application.properties
    1. spring.datasource.url=jdbc:mysql://localhost:3306/test
    2. spring.datasource.username=root
    3. spring.datasource.password=root
    4. spring.datasource.driverClassName=com.mysql.jdbc.Driver
    5. spring.datasource.max-active=20
    6. spring.datasource.max-idle=8
    7. spring.datasource.min-idle=8
    8. spring.datasource.initial-size=10
    复制代码

    九 SQL
    1. CREATE TABLE `t_account`??(
    2. ??`id` int(11) NOT NULL,
    3. ??`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    4. ??`balance` float(255, 0) NULL DEFAULT NULL,
    5. ??PRIMARY KEY (`id`) USING BTREE
    6. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

    7. INSERT INTO `t_account` VALUES (1, 'zhangsan', 700);
    8. INSERT INTO `t_account` VALUES (2, 'lisi', 300);
    复制代码

    十 修改AccountServiceImpl.java
    去掉或添加@Transactional以及去掉或添加int zero = 1/0;的代码组合,访问URL
    http://localhost:8080/account/transfer
    在数据库中验证数据的正确性即可


    资源帝国 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与资源帝国享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和资源帝国的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、资源帝国管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|资源帝国 ( 皖ICP备14009953号 )?

    GMT+8, 2019-8-11 01:52 , Processed in 0.147392 second(s), 26 queries .

    Powered by Discuz! X3.2

    ? 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表