Spring 源码解析 | Spring 事务(一)(下)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本文主要讲述 Spring 事务的实现,以及申明式事务 @Transactional 使用案例。

添加配置


这里有 4 个配置,我们需要配置: DataSourceDataSourceTransactionManagerJdbcTemplateTransactionTemplate (JDBC 事务管理)


@Configuration
@EnableTransactionManagement
@Import({SummerMainService.class})
public class DataSourceConfig {
  @Bean
  public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    return jdbcTemplate;
  }
  /**
   * JDBC 事务
   *
   * @param transactionManager
   * @return
   */
  @Bean
  public TransactionTemplate transactionTemplate(DataSourceTransactionManager transactionManager) {
    return new TransactionTemplate(transactionManager);
  }
  /**
   * 申明数据源
   *
   * @return
   */
  @Bean
  public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://127.0.0.1/summer_test?useUnicode=true&characterEncoding=utf-8&useSSL=false");
    dataSource.setUsername("root");
    dataSource.setPassword("root123");
    return dataSource;
  }
  /**
   * 申明事务管理器
   *
   * @return
   */
  @Bean
  public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
  }
}


业务逻辑


下面的逻辑重要是插入一条数据,如果 id % 2 == 0 就进行事务的回滚。


public class SummerMainService {
  @Autowired
  private JdbcTemplate jdbcTemplate;
  /**
   * 编程式事务 例子: @Transactional
   */
  @Transactional
  public void testCommit() {
    String uuid = UUID.randomUUID().toString().replace("-", "");
    jdbcTemplate.update("insert into summer_main(`name`) value ('" + uuid + "')");
    List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from summer_main where `name` = '" + uuid + "'");
    Integer id = null;
    if (maps.size() > 0) {
      Map<String, Object> stringObjectMap = maps.get(0);
      id = Integer.parseInt(String.valueOf(stringObjectMap.get("id")));
      if (id % 2 == 0) {
        throw new RuntimeException("system error transaction rollback!");
      }
    }
    jdbcTemplate.update("update summer_main set remarks = 'WaKen Notes' where id = " + id);
  }
}


程序调用


调用代码如下,我们同样还是分为三个步骤:创建容器,获取对象,调用方法。


public class TransactionTest {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(DataSourceConfig.class);
    SummerMainService summerMainService = applicationContext.getBean(SummerMainService.class);
    summerMainService.testCommit();
  }
}


SQL 脚本


DROP TABLE IF EXISTS `summer_main`;
CREATE TABLE `summer_main` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(200) DEFAULT NULL COMMENT '名称',
  `remarks` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `summer_main` (`id`, `name`, `remarks`)
VALUES
  (1,'1af523e120ee4229aaedea1badd6af69','WaKen Notes'),
  (2,'16988516671447afa585dfc3a0069dd6',NULL),
  (3,'820708fb5daa469786272f21410b53c1','WaKen Notes'),
  (4,'c4247f97ed524d609e6afe2d7db461ff',NULL);


参考资料




相关文章
|
12天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
42 2
|
20天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
34 1
Spring高手之路24——事务类型及传播行为实战指南
|
13天前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
20 3
|
12天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
25天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
41 3
|
7月前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。
|
7月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
96 1
|
2月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
115 5
|
2月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
134 9

推荐镜像

更多
下一篇
无影云桌面