Day14 基于AOP的声明式事务控制

news/2024/11/1 17:26:45/

1 Spring 事务编程概述

PlatformTransactionManager +TransactionDefinition = TransactionStatus

2 搭建环境

  • 数据库准备一个账户表tb account;

  • dao层准备一个AccountMapper,包括incrMoney和decrMoney两个方法;service层准备一个transferMoney方法,分别调用incrMoney和decrMoney方法

  • 在applicationContext文件中进行Bean的管理配置

  • 测试正常转账与异常转账

数据库

CREATE TABLE `tb_accout` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键自增',`account_name` VARCHAR(32) COMMENT '账户名称',money INT COMMENT '金额'
);INSERT INTO tb_accout(account_name,money) VALUE('tom',5000);
INSERT INTO tb_accout(account_name,money) VALUE('lucy',5000);

mapper

/*** @author : msf* @date : 2023/1/28*/
@Mapper
public interface AccountMapper {void incrMoney(@Param("accountName") String accountName, @Param("money")Integer money);void decrMoney(@Param("accountName") String accountName, @Param("money")Integer money);
}

Service

public interface AccountService {void transferMoney(String outAccount, String inAccount, Integer money);
}
@Service("accountService")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic void transferMoney(String outAccount, String inAccount, Integer money) {accountMapper.decrMoney(outAccount,money);accountMapper.incrMoney(inAccount,money);}
}

xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--注解组件扫描:扫描指定的基本包及其子包下的类,识别使用@Component注解--><context:component-scan base-package="org.example"/><context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源信息--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--    配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property></bean><!--    MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.example.mapper"></property></bean>
</beans>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.AccountMapper"><update id="incrMoney">update tb_accout set money = money +  #{money} where account_name = #{accountName}</update><update id="decrMoney">update tb_accout set money = money -  #{money} where account_name = #{accountName}</update>
</mapper>

结果

3 基于xml声明式事务控制

在业务层进行事务控制;

<!--配置事务平台管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--配置spring 提供好的advisor--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--事务属性配置,任意方法都需要默认的事务属性--><tx:method name="*"/></tx:attributes></tx:advice><!--事务增强的aop--><aop:config><aop:pointcut id="txPointcut" expression="execution(* org.example.service..*.*(..))"/><!--配置织入 spring提供好的通知--><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/></aop:config>

事务的传播行为

4 基于注解声明式事务控制

@Transaction

@EnableTransactionManagement 相当于注解扫描


http://www.ppmy.cn/news/20193.html

相关文章

2022年终总结-正月初七

这是毕业的第二年也是第二次写年终总结&#xff0c;元旦过后工作一直忙加上身体不舒服回家过年种种事情拖到现在。 在过去的一年中&#xff0c;爱情和事业都有一些进展。去了老丈人家、双方父母见面&#xff0c;陪小舅子打麻将&#xff0c;夏天在户外烤串等等。涨了工资&#…

Unicode编码

Unicode编码以上我们介绍了中文和西欧的字符与编码&#xff0c;但世界上还有很多其他国家的字符&#xff0c;每个国家的各种计算机厂商都对自己常用的字符进行编码&#xff0c;在编码的时候基本忽略了其他国家的字符和编码&#xff0c;甚至忽略了同一国家的其他计算机厂商&…

这些好用的办公软件分享给你

软件一&#xff1a;备忘录 现在大部分手机备忘录都提供语音记录功能&#xff0c;可以实时录音并转换成文本内容记录下来&#xff0c;使用起来还是比较方便的&#xff0c;但是要注意它支持转换的时长是有限制的哦&#xff01; 操作步骤&#xff1a;打开手机备忘录&#xff0c;…

Hadoop基础之《(5)—MapReduce概述》

一、什么是MapReduce MapReduce将计算过程分为两个阶段&#xff1a;Map和Reduce。 1、Map阶段并行处理输入数据。 2、Reduce阶段对map结果进行汇总。 二、结构图 三、HDFS、Yarn、MapReduce三者之间的调用关系 HDFS三台服务器&#xff0c;第一台上有DataNode和NameNode。第二…

Qt扫盲-Reentrant和线程安全

Reentrant和线程安全一、概述二、Reentrant三、线程安全四、Qt类的注意事项一、概述 在整个文档中&#xff0c; Reentrant 和 thread-safe 术语用于标记类和函数&#xff0c;指明如何在多线程应用程序中使用它们: 一个 thread-safe的函数可以从多个线程同时调用&#xff0c;即…

4729. 解密

Powered by:NEFU AB-IN Link 文章目录4729. 解密题意思路代码4729. 解密 题意 给定一个正整数 k, 有 k次询问&#xff0c;每次给定三个正整数 ni,ei,di&#xff0c;求两个正整数 pi,qi&#xff0c;使 nipiqi&#xff0c;eidi(pi−1)(qi−1)1 思路 通过数学推导可以推出 p q …

Git操作

合并远端提交 将远程三次提交合成一次 git -rebase -i HEAD~3:wq 保存 就叫 day 17 再保存 最后 git push -f提交 rebase 与 merge merge 1 新建一个分支 git chekout -b feature-1 添加代码a 并提交 1.1 发现此次提交内容有误 又不想产生两条提交记录 先 git add . gi…

[Vulnhub] DC-4

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-4.zip 同DC-3 这个靶机也是只有一个flag。 全面信息搜集hydra爆破登录和ssh密码teehee命令(写入文件内容)提权/etc/passwd & /etc/sudoers 文件利用 目录 <1> 信息搜集 <2> hydra爆破登录密码 <…