转账为demo,spring事务

spring 事务使用

  • 1. 业务代码
  • 2. xml配置
  • 3. 注解配置

1. 业务代码

  • 数据表结构
  • dao
package com.lovely.dao.impl;import com.lovely.dao.AccountDao;
import org.springframework.jdbc.core.JdbcTemplate;/*** @author echo lovely* @date 2020/8/9 11:01*/
public class AccountDaoImpl implements AccountDao {private JdbcTemplate jdbcTemplate;// 提供set方法 用于依赖注入public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 出账public void out(String outMan, Double money) {String sql = "update account set money = money - ? where name = ?";jdbcTemplate.update(sql, new Object[]{money, outMan});}// 进账public void in(String inMan, Double money) {String sql = "update account set money = money + ? where name = ?";jdbcTemplate.update(sql, new Object[]{money, inMan});}
}
  • service
package com.lovely.service.impl;import com.lovely.dao.AccountDao;
import com.lovely.service.AccountService;/*** @author echo lovely* @date 2020/8/9 11:08*/
public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}/*** 转账业务具体实现 需要使用事务* @param outMan 转出人* @param inMan  收账人* @param money  money*/public void transfer(String outMan, String inMan, Double money) {accountDao.in(inMan, money);System.out.println(1/0);accountDao.out(outMan, money);}
}
  • controller
package com.lovely.controller;import com.lovely.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author echo lovely* @date 2020/8/9 11:12*/
public class AccountController {public static void main(String[] args) {ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");AccountService accountService = app.getBean(AccountService.class);// 转账测试accountService.transfer("jack", "rose", 1000.0);}
}
  • 上面的bean的创建方式set注入,没搞注解

2. xml配置

  • 核心 事务管理器 对转账方法动态进行事务控制
    <!-- 数据源事务管理器 --><bean id="tranManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 事务通知 增强方法 --><tx:advice id="txAdvice" transaction-manager="tranManager"><!--事务属性信息的配置--><tx:attributes><tx:method name="*"/><!--<tx:method name="transfer*" isolation="DEFAULT" read-only="false"/>--></tx:attributes></tx:advice><!-- 配置事务的织入 --><aop:config><!--<aop:pointcut id="myPointcut" expression="execution(* com.lovely.service.impl.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>--><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lovely.service.impl.*.*(..))"/></aop:config>

3. 注解配置

  1. 注解配置
    <!-- 数据源事务管理器 --><bean id="tranManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 开启事务的注解驱动 --><tx:annotation-driven transaction-manager="tranManager"></tx:annotation-driven>
  1. 事务注解
package com.lovely.service.impl;import com.lovely.dao.AccountDao;
import com.lovely.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/*** @author echo lovely* @date 2020/8/9 11:08*/@Service("accountServiceImpl")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;/*** 转账业务具体实现 需要使用事务* @param outMan 转出人* @param inMan  收账人* @param money  money*/@Transactional(timeout = 1)public void transfer(String outMan, String inMan, Double money) {accountDao.in(inMan, money);System.out.println(1/0);accountDao.out(outMan, money);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

影响你35岁前成功的好习惯与坏习惯

你想成功吗&#xff1f;那就及早培养有利于成功的好习惯。 习惯的力量是惊人的&#xff0c;35岁以前养成的习惯决定着你是否成功。 有这样一个寓言故事&#xff1a;一位没有继承人的富豪死后将自己的一大笔遗产赠送给远房的一位亲戚&#xff0c;这位亲戚是一个常年靠乞讨为生…

八、计数排序及其应用分析

1 本节思路 之前的算法的最基本的思想是比较元素大小&#xff0c;所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn)&#xff0c;本节不再基于元素比较&#xff0c;而是基于计数的Counting sort&#xff0c;然后应用在Radix sort上。 2 Counting sort 2.1 算法思想 Cou…

Google开发者模式调试css样式的方法

界面如下&#xff0c;你需要调试css样式… 看下图&#xff0c;高仿某云播放界面部分 需求 1.h5开发手机端界面&#xff0c;禁用缩放 2.如何精准的定位像上图一样&#xff0c;或者更好 3.使用Google调试器&#xff0c;调试css样式如何调样式 选择对应的样式 确定多个元素…

OD汇编需要标签

如何解决&#xff0c;看那红体字。。。 push 0046ad70 标签就是地址的引用 zai破解的道路上面面前行 技术参考&#xff1a;http://zhidao.baidu.com/link?url8JP8KFxTinclhl6MwpaZw5buhtv1p4zgpjy8rKkBPvD4YqCq2uudXQZrhuBLPGZm5ahe3d7YsLb3MeAFDXfsua转载于:https://www.cnbl…

git与github使用

1 从github上clone到本地 配置Git 首先在本地创建ssh key&#xff1b; $ ssh-keygen -t rsa -C "your_emailyouremail.com"后面的your_emailyouremail.com改为你在github上注册的邮箱&#xff0c;之后会要求确认路径和输入密码&#xff0c;我们这使用默认的一路回车…

bootstrap panel 布局

panel1. 效果2. 基于bootstrap实现用于页面分专栏展示 1. 效果 成品 2. 基于bootstrap实现 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>panel 布局</title><link rel"stylesheet" href"cs…

GDB高级调试

一、多线程调试 多线程调试可能是问得最多的。其实&#xff0c;重要就是下面几个命令&#xff1a; info thread 查看当前进程的线程。thread <ID> 切换调试的线程为指定ID的线程。break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。set …

pytorch之with torch.no_grad

在使用pytorch时&#xff0c;并不是所有的操作都需要进行计算图的生成&#xff08;计算过程的构建&#xff0c;以便梯度反向传播等操作&#xff09;。而对于tensor的计算操作&#xff0c;默认是要进行计算图的构建的&#xff0c;在这种情况下&#xff0c;可以使用 with torch.n…

mysql时间处理

两种方式&#xff0c;一个是在数据库查询的时候就截取&#xff0c;另一个就是在使用的时候截取。 1.数据库 select date_format(日期字段,’%Y-%m-%d’) as ‘日期’ from test 2.java程序 SimpleDateFormat dateFm new SimpleDateFormat("yyyy-MM-dd"); String da…

pytorch之object.grad.zero_()

object.grad.zero_()的意思是清0object的梯度值。 下面做个实验。 x torch.arange(4.0) x.requires_grad_(True) x.grad # 注意此时为None&#xff0c;不为0 y 2 * torch.dot(x, x) y.backward() x.grad # tensor([ 0., 4., 8., 12.]) x.grad.zero_() x.grad # tensor([0.…

PHP日期、时间戳相关的小程序

1、日期区间内的日期列表&#xff08;天&#xff09;&#xff1a; 1 public function dateExtent($begin,$end){ 2 $begin strtotime($begin); 3 $end strtotime($end); 4 while($begin<$end){ 5 $dateArr[] date…

spring jdbctemplate 实体列与数据表列 查询

目录1. BeanPropertyRowMapper接口2. 创建mapper类实现接口1. BeanPropertyRowMapper接口 当我查询时&#xff0c;使用下面的接口&#xff0c;原理是根据实体类的字段名和表的列名相同时才有结果&#xff0c;否则对应的字段是null List<MusicSong> songList jdbcTempl…

pytorch之trainer.zero_grad()

在下面的代码中&#xff0c;在每次l.backward()前都要trainer.zero_grad()&#xff0c;否则梯度会累加。 num_epochs 3 for epoch in range(num_epochs):for X, y in data_iter:l loss(net(X), y)trainer.zero_grad()l.backward()trainer.step()l loss(net(features), labe…

35款让你爱不释手的网页元素PSD素材

网页元素是构成一个网页的基本元素&#xff0c;包括按钮、表单、文本框、进度条等。这里收集了30款让你爱不释手的网页元素PSD素材。 1、国外个性网页模板UI设计PSD素材 下载地址>>> 2、带分享按钮的网页导航栏UI设计PSD素材 下载地址>>> 3、两款简洁的搜索框…