spring学习JdbcTemplate数据库事务管理

作者:把苹果咬哭的测试笔记 时间:2024-01-28 10:46:13 

spring JdbcTemplate数据库事务管理

现在有个账户表,里面存着用户金额。

spring学习JdbcTemplate数据库事务管理

如果要真正地做好转账的操作,就要用到事务,否则当出现异常后会出现数据不一致等问题。

try {
 // 第一步 开启事务
 // 第二步 进行业务操作
 // 第三步 没有发生异常,提交事务
} catch(){
 // 第四步 发生异常,事务回滚
}

一、spring 中的事务管理

通常,把事务加在 service 层(业务逻辑层)。

而在 spring 中管理事务可以有 2 种方式实现:

  • 编程式管理:就像上面伪代码那样,这种使用起来不方便。

  • 声明式管理:通过配置方式实现,推荐使用。其中,可以基于 XML 方式进行配置,也可以基于注解,显然后者更方便。

在 spring 中进行声明式事务管理,底层使用的是 AOP 原理。

二、spring 事务管理 API

spring 提供了一个接口 PlatformTransactionManager ,代表事务管理器。此接口针对不同的框架提供不同的实现类。

利用idea工具,展开结构,使用 jdbcTemplate 用到的是 DataSourceTransactionManager 。

spring学习JdbcTemplate数据库事务管理

三、使用事务管理

1. 配置文件

创建事务管理器。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <!--注入数据源-->
       <property name="dataSource" ref="dataSource"></property>
   </bean>

开启事务注解,使用名称空间 tx

<!--开启事务注释-->
   <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

2. 类上添加事务注解

注解 @Transactional 可以加在 service 类上,也可以加到方法上:

加到类上,表示类下所有的方法都添加了事务。加到方法,表示只有该方法添加事务。

@Service
@Transactional
public class UserService {
   @Autowired
   private UserDao userDao;
   // 转账方法
   public void accountMoney() {
       // 大周 少 100
       userDao.reduceMoney();
       // 模拟异常
       int i = 1/0;
       // 小毛 加 100
       userDao.addMoney();
   }
}

接口实现类 UserDaoImpl 。

@Repository
public class UserDaoImpl implements UserDao {
   @Autowired
   private JdbcTemplate jdbcTemplate;
   @Override
   public void addMoney() {
       String sql = "update t_account set money=money+? where username=?";
       jdbcTemplate.update(sql, 100, "小毛");
   }
   @Override
   public void reduceMoney() {
       String sql = "update t_account set money=money-? where username=?";
       jdbcTemplate.update(sql, 100, "大周");
   }
}

到测试类里执行一下:

public class TestTrans {
   @Test
   public void testJdbc() {
       ApplicationContext context =
               new ClassPathXmlApplicationContext("bean1.xml");
       UserService userService = context.getBean("userService", UserService.class);
       userService.accountMoney();
   }
}

注意,上面的 service 里我手动添加了异常,所以执行后,事务应该是要回滚操作,2 个人的金额仍然各是 1000 。

八月 07, 2021 10:39:57 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
java.lang.ArithmeticException: / by zero

刷新数据表。

spring学习JdbcTemplate数据库事务管理

现在我去掉 service 类中的异常 int i = 1/0;,重新执行测试方法:

八月 07, 2021 10:47:01 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
Process finished with exit code 0

刷新数据表。

spring学习JdbcTemplate数据库事务管理

结果正确。

来源:https://blog.csdn.net/wessonlan/article/details/124812976

标签:spring,Jdbc,Template,数据库,事务
0
投稿

猜你喜欢

  • python批量处理打开多个文件

    2022-10-21 05:26:47
  • javascript使用location.search的示例

    2023-07-16 09:14:40
  • python基础详解之if循环语句

    2022-04-17 02:14:09
  • Python分割单词和转换命名法的实现

    2023-11-24 00:06:16
  • SQL Server利用sp_spaceused如何查看表记录存在不准确的情况

    2024-01-20 07:40:10
  • Python打印输出数组中全部元素

    2022-08-07 19:35:12
  • 解决Django中多条件查询的问题

    2021-10-10 07:32:16
  • Python制作脚本帮女朋友抢购清空购物车

    2021-08-30 04:40:01
  • go mode tidy出现报错go: warning: “all“ matched no packages的解决方法

    2024-02-04 22:35:14
  • python解包概念及实例

    2022-07-01 11:30:03
  • Python面向对象之静态属性、类方法与静态方法分析

    2021-03-28 15:14:22
  • php输出指定时间以前时间格式的方法

    2024-05-09 14:46:39
  • Python设计模式中的结构型适配器模式

    2023-07-19 11:59:54
  • 在SQL中修改数据的基础语句

    2024-01-28 06:02:15
  • 详解webpack require.ensure与require AMD的区别

    2024-05-03 15:08:18
  • 14条最佳JS代码编写技巧[译]

    2009-11-09 19:37:00
  • MySQL数据备份之mysqldump的使用详解

    2024-01-18 20:46:57
  • 基于ASP的站内多值搜索

    2010-05-11 20:03:00
  • php返回字符串中所有单词的方法

    2024-06-05 09:48:16
  • Javascript操作cookie的类

    2007-08-23 09:36:00
  • asp之家 网络编程 m.aspxhome.com