服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - spring学习JdbcTemplate数据库事务管理

spring学习JdbcTemplate数据库事务管理

2023-02-07 14:01把苹果咬哭的测试笔记 Java教程

这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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数据库事务管理

结果正确。

以上就是spring学习JdbcTemplate数据库事务管理的详细内容,更多关于spring JdbcTemplate数据库事务的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/wessonlan/article/details/124812976

延伸 · 阅读

精彩推荐
  • Java教程SpringBoot2.0 ZipKin示例代码

    SpringBoot2.0 ZipKin示例代码

    这篇文章主要介绍了SpringBoot2.0 ZipKin示例代码,详细的介绍了什么是ZipKin以及SpringBoot2.0 ZipKin示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    攻城遭雷劈11272021-06-11
  • Java教程Spring Boot 2.0多数据源配置方法实例详解

    Spring Boot 2.0多数据源配置方法实例详解

    这篇文章主要介绍了Spring Boot 2.0多数据源配置方法实例详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    __HelloWorld__5152021-05-31
  • Java教程详解Java并发包基石AQS

    详解Java并发包基石AQS

    Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共同的基类--Abstract...

    dreamcatcher-cx4572022-01-06
  • Java教程搞懂JAVAObject中的hashCode()

    搞懂JAVAObject中的hashCode()

    今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋...

    马走日mazouri4002021-11-16
  • Java教程Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解

    这篇文章主要介绍了Java中的动态和静态编译实例详解的相关资料,需要的朋友可以参考下...

    Java之家2952020-09-05
  • Java教程Java实现一个简单的缓存方法

    Java实现一个简单的缓存方法

    本篇文章主要介绍了Java实现一个简单的缓存方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    BrightLoong3662020-09-13
  • Java教程[Spring MVC] -简单表单提交实例

    [Spring MVC] -简单表单提交实例

    本篇文章主要介绍了[Spring MVC] -简单表单提交实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。 ...

    横渡3182020-07-12
  • Java教程Java使用反射和动态代理实现一个View注解绑定库

    Java使用反射和动态代理实现一个View注解绑定库

    这篇文章主要介绍了Java使用反射和动态代理实现一个View注解绑定库,代码简洁,使用简单,扩展性强,结合实例代码给大家介绍的非常详细,需要的朋友可...

    木水Code9252022-12-08