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

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 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);


参考资料




相关文章
|
4天前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
|
3天前
|
存储 SQL 关系型数据库
深入解析MySQL事务机制和锁机制
深入解析MySQL事务机制和锁机制
|
8天前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
32 1
|
8天前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
21 1
|
15天前
|
NoSQL Redis
redis 6源码解析之 ziplist
redis 6源码解析之 ziplist
16 5
|
3天前
|
算法 安全 Java
深入解析Java多线程:源码级别的分析与实践
深入解析Java多线程:源码级别的分析与实践
|
3月前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
45 0
|
3月前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。
|
3月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
59 1
|
22天前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
60 11

热门文章

最新文章

推荐镜像

更多