SpringBoot之事务处理机制的示例分析

这篇文章将为大家详细讲解有关SpringBoot之事务处理机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

专注于为中小企业提供成都网站设计、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业武陵源免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

一、Spring的事务机制

所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务、提交事务来完成数据操作,或者在发生错误的时候回滚数据。

而Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理。Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现:

SpringBoot之事务处理机制的示例分析

在程序中定义事务管理器的代码如下:

@Bean 
public PlatformTransactionManager transactionManager() { 
 JpaTransactionManager transactionManager = new JpaTransactionManager(); 
 transactionManager.setDataSource(dataSource()); 
 return transactionManager; 
}

二、声明式事务

Spring支持声明式事务,即使用注解来选择需要使用事务的方法,它使用@Transactional注解在方法上表明该方法需要事务支持。

@Transactional 
public void saveSomething(Long id, String name) { 
 //数据库操作 
}

在此处需要特别注意的是,此@Transactional注解来自org.springframework.transaction.annotation包,而不是javax.transaction。

Spring提供了一个@EnableTransactionManagement注解在配置类上来开启声明式事务的支持。使用了@EnableTransactionManagement后,Spring容器会自动扫描注解@Transactional的方法和类。@EnableTransactionManagement的使用方式如下:

@Configuration 
@EnableTransactionManagement 
public class AppConfig { 
 
}

三、类级别使用@Transactional

@Transactional不仅可以注解在方法上,也可以注解在类上。当注解在类上的时候意味着此类的所有public方法都是开启事务的。如果类级别和方法级别同时使用了@Transactional注解,则使用在类级别的注解会重载方法级别的注解。

四、Spring Data JPA的事务支持

Spring Data JPA对所有的默认方法都开启了事务支持,且查询类事务默认启用readOnly=true属性。

这个从源码SimpleJpaRepository中可以看出,SimpleJpaRepository在类级别定义了@Transactional(readOnly=true),而在和save、delete相关的操作重写了@Transactional属性,此时readOnly属性是false,其余查询操作readOnly仍然为false。

五、Spring Boot的事务支持

1.自动配置的事务管理器

在使用JDBC作为数据访问技术的时候,SpringBoot为我们定义了PlatformTransactionManager的实现DataSourceTransactionManager的Bean;配置见org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration类中的定义:

@Bean 
@ConditionalOnMissingBean 
@ConditionalOnBean(DataSource.class) 
public PlatformTransactionManager transactionManager() { 
 return new DataSourceTransactionManager(this.dataSource); 
}

在使用JPA作为数据访问技术的时候,Spring Boot为我们了定义一个PlatformTransactionManager的实现JpaTransactionManager的Bean;配置见org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.class类中的定义:

@Bean 
@ConditionalOnMissingBean(PlatformTransactionManager.class) 
public PlatformTransactionManager transactionManager() { 
 return new JpaTransactionManager(); 
}

2.自动开启注解事务的支持

Spring Boot专门用于配置事务的类为:org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,此配置类依赖于JpaBaseConfiguration和DataSourceTransactionManagerAutoConfiguration。

而在DataSourceTransactionManagerAutoConfiguration配置里还开启了对声明式事务的支持,代码如下:

@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class) 
@Configuration 
@EnableTransactionManagement 
protected static class TransactionManagementConfiguration { 
 
}

所以在Spring Boot中,无须显示开启使用@EnableTransactionManagement注解。

六、实例(Springboot)

1.pom.xml:

 
 org.springframework.boot 
 spring-boot-starter-web 
 
 
 org.springframework.boot 
 spring-boot-starter-data-jpa 
 
 
 org.springframework.boot 
 spring-boot-starter-data-rest 
 
 
 MySQL 
 mysql-connector-java 
 runtime 

2.application.yml:

server: 
 port: 5000 
 
spring: 
 datasource: 
 driver-class-name: com.mysql.jdbc.Driver 
 url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 
 username: root 
 password: password 
 
 jpa: 
 hibernate: 
 ddl-auto: update # 第一次简表create 后面用update 
 show-sql: true

3.实体类Staff:

@Entity 
public class Staff { 
 @Id 
 @GeneratedValue 
 private Long id; 
 private String name; 
 private Integer age; 
 private String address; 
 
 public Staff() { 
 super(); 
 } 
 
 public Staff(Long id, String name, Integer age, String address) { 
 super(); 
 this.id = id; 
 this.name = name; 
 this.age = age; 
 this.address = address; 
 } 
 //省略get、set方法 
}

4.Staff的Repository:

public interface StaffRepository extends JpaRepository { 
 
}

5.服务接口:

public interface StaffService { 
 public Staff saveStaffWithRollBack(Staff staff);//回滚 
 public Staff saveStaffWithoutRollBack(Staff staff);//不回滚 
}

6.服务实现:

@Service 
public class StaffServiceImpl implements StaffService { 
 
 @Autowired 
 StaffRepository staffRepository; //可以直接注入我们的RersonRepository的Bean。 
 
 @Override 
 //使用@Transactional注解的rollbackFor属性,指定特定异常时,数据回滚。 
 @Transactional(rollbackFor = {IllegalArgumentException.class}) 
 public Staff saveStaffWithRollBack(Staff staff) { 
 Staff s = staffRepository.save(staff); 
 if (staff.getName().equals("张三")) { 
  throw new IllegalArgumentException("张三已经存在了,rollback"); 
 } 
 return s; 
 } 
 
 @Override 
 public Staff saveStaffWithoutRollBack(Staff staff) { 
 Staff s = staffRepository.save(staff); 
 if (staff.getName().equals("张三")) { 
  throw new IllegalArgumentException("张三已经存在了,数据不回滚"); 
 } 
 return s; 
 } 
}

7.Controller:

@RestController 
@RequestMapping("/staff") 
public class StaffController { 
 @Autowired 
 StaffService staffService; 
 
 //测试回滚情况 
 @RequestMapping("/rollback") 
 public Staff rollback(Staff staff) { 
 return staffService.saveStaffWithRollBack(staff); 
 } 
 
 //测试不回滚情况 
 @RequestMapping("/notrollback") 
 public Staff noRollBack(Staff staff) { 
 return staffService.saveStaffWithoutRollBack(staff); 
 } 
}

8.运行测试:

(1)回滚:http://localhost:5000/staff/rollback?name=张三&age=18

SpringBoot之事务处理机制的示例分析

控制台:

SpringBoot之事务处理机制的示例分析

数据库:

SpringBoot之事务处理机制的示例分析

(2)不回滚:http://localhost:5000/staff/notrollback?name=张三&age=18

SpringBoot之事务处理机制的示例分析

控制台:

SpringBoot之事务处理机制的示例分析

数据库:

SpringBoot之事务处理机制的示例分析

关于“SpringBoot之事务处理机制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


网页名称:SpringBoot之事务处理机制的示例分析
网页地址:http://ybzwz.com/article/igdsie.html