JAVAEE框架之Spring事务

举报
tea_year 发表于 2021/12/23 01:28:21 2021/12/23
【摘要】 JAVAEE框架之Spring 八.Spring事务 8.1 转账业务 AccountServiceImple 转账业务实现类代码 /** * 转账业务 * @param so...

JAVAEE框架之Spring

八.Spring事务

8.1 转账业务

AccountServiceImple 转账业务实现类代码

/**
     * 转账业务
     * @param sourceId
     * @param targetId
     * @param money
     */
    public void transfer(Integer sourceId, Integer targetId,Double money) {
        //1.根据id,查询转出账户
        Account source=accountDao.selectAccount(sourceId);
        //2.根据id,查询转入账户
        Account target=accountDao.selectAccount(targetId);
        //3.转出账户减钱
        source.setMoney(source.getMoney()-money);
        //4.转入账户加钱
        target.setMoney(target.getMoney()+money);
        //5.更新转出账户
        accountDao.updateAccount(source);
        //6.更新转入账户
        accountDao.updateAccount(target);
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

8.2测试

ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取Spring的bean
        AccountService accountService = (AccountService) ac.getBean("accountService");
        //3.2 测试转账业务
        accountService.transfer(1,2,1111.0);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

结果成功!!!

但是如果在转账业务类步骤5 6之间出现各种异常情况如何呢?(断点、异常代码等)

这里模拟int result=i/0;

问题发现转出账户已经扣钱了,而转入账户则没有得到相应的金额。

8.3 线程连接工具类

package com.aaa.util;

import javax.sql.DataSource;
import java.sql.Connection;
/**
 * Created by 张晨光 on 2020/7/4 11:42
 * 连接的工具类,用于从数据源中获取连接,并且实现和线程的绑定
 */
public class ConnUtils {
    private ThreadLocal<Connection> threadLocal=new ThreadLocal<Connection>();
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    /**
     * 获取线程上的连接
     * @return
     */
    public Connection getThreadConnection(){
        try {
            //1.从threadLocal获取本地链接对象
            Connection conn=threadLocal.get();
            //2.判断当前线程上是否有链接;
            if(conn==null){
                //3.从数据源中获取链接对象,存入threadLocal中
                conn=dataSource.getConnection();
                threadLocal.set(conn);
            }
            //4.返回当前线程上的链接;
            return conn;
        } catch (Exception e) {
           throw new RuntimeException(e);
        }
    }
    /**
     * 解绑连接对象和线程
     */
    public void removeConnection(){
        threadLocal.remove();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

8.4 事务管理类

package com.aaa.util;

import java.sql.SQLException;

/**
 * Created by 张晨光 on 2020/7/4 11:53
 */
public class TransactionManager {
    //调用连接管理类
    private ConnUtils connUtils;

    public void setConnUtils(ConnUtils connUtils) {
        this.connUtils = connUtils;
    }

    /**
     * 设置开始的时候自动提交事务为false,变为手动提交;
     */
    public void beginTransaction(){
        try {
            connUtils.getThreadConnection().setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 自动提交事务
     */
    public void commit(){
        try {
            connUtils.getThreadConnection().commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 回滚事务
     */
    public void rollback(){
        try {
            connUtils.getThreadConnection().rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 释放连接
     */
    public void release(){
        try {
            connUtils.getThreadConnection().rollback();
            connUtils.removeConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

8.5 Spring自带事务类

<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="tx"/>

  
 
  • 1
  • 2
  • 3
  • 4

转账业务类

@Service("accountService")
@Transactional
public class AccountServiceImpl implements AccountService

  
 
  • 1
  • 2
  • 3

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/107588621

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。