- 浏览: 599207 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
一、事务相关概念
1、事务的特点
原子性:事务是一个原子操作,由一系列的动作完成,这一系列动作要么全部完成,要么全部都不完成。
一致性:一旦事务完成,事务建立的业务必须处于一致状态。
隔离性:针对很多事务处理相同的数据,事务之间必须隔离起来,不能够产生数据之间的相互影响。
持久性:一旦事务完成,那么事务建立的状态必须长久的保留下去,不能够相互影响。
2、基本事务属性定义
事务属性是什么?事务属性可以理解成事务的一些基本配置,表示了事务属性如何运用到方法上。
(1)事务的第一个行为是传播行为,当事务被另一个事务调用的时候,必须指定事务应该如何传播。例如方法可以在现有事务中运行,也可以开启一个新事务。Spring定义了七种传播行为,如下:
PROPAGATION_REQUIRED:表示当前方法必须在事务中运行,如果当前事务存在,就在当前事务中运行,如果不存在,则从新开启一个新事务。
PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,如果当前事务存在,则在当前事务中运行。
PROPAGATION_MANDATORY:表示当前方法必须在事务中运行,如果事务不存在,则会抛出异常。
PROPAGATION_REQUIRED_NEW:表示当前方法必须在自己的事务中运行。如果一个新的事务将被启动。如果存在当前事务,当前事务将被挂起。
PROPAGATION_NEVER:表示当前方法不应该运行在失误上下文中,如果存在当前事务,则会抛出异常。
PROPAGATION_NESTED:表示如果已经存在一个事物,那么该方法会嵌套在事务中运行。嵌套事务可以独立于当前事务单独地进行提交和回滚。
在此注意区分PROPAGATION_REQUIRED_NEW和PROPAGATION_NESTED,前者的两个事务,外层事务和内层事务是相互独立的两个事务,也就是内层事务的回滚不会影响外层事务,同时外层事务的回滚也不会影响内层事务。而对于后者,内层事务是依赖于外层事务的,也就是内层事务的回滚不会造成外层事务的回滚,而外层事务的回滚要造成内层事务的回滚。
(2)隔离级别
事务的第二个级别就是隔离级别,隔离级别定义了一个事务受其他并发事务的影响程度。
并发事务通常可能引起如下的问题:
脏读:脏读发生在一个事务读取了另一个事务改写了但是还没有提交的数据,那么这个时候如果另一个事务对数据进行了回滚,事务读取的数据就是无效的。
不可重复读:不可重复读是一个事务执行相同的查询两次以上,但是前后两次读取到的数据是不相同的,那是因为在两次读取数据的间歇中间,另一个事务对数据进行了修改。
幻读:幻读和不可重复读类似。发生在一个事务读取了几行数据,另一个事务又插入了几行数据,在随后的查询中将会发现数据发生了改变。
不可重复读和幻读的区别在于不可重复读重在修改,而欢度在于添加和删除。
具体的隔离级别如下:
ISOLATION_DEFAULT:使用数据库后端默认的隔离级别。
ISOLATION_READ_UNCOMMITED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读。
ISOLATION_READ_COMMITED:允许读取并发事务提交的数据变更,可以防止脏读,但是不能够阻止不可重复读和幻读。
ISOLATION_REPEATABLE_READ:对同一字段多次读取的结果是一样的,除非事务本身修改了数据。可以防止脏读和不可重复读。
ISOLATION_SERIALIZABLE:最高的隔离级别,可以防止脏读、不可重复读和幻读。
(3)事务的只读属性
事务的第三个特性是它是否为只读事务。如果事务只对后端的数据库进行该操作,数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。
(4)事务超时
为了使应用程序很好地执行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要地占用数据资源。事务超
时是事务的一个定时器,在特定的时间内事务如果没有执行完毕,那么久自动回滚,而不一定等待其结束。
(5)回滚规则
事务五边形的最后一组规则,这些规则定义了那些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查异常时不会回滚(这一行为与EJB的回滚行为是一只的)
但是你可以声明事务在遇到特定的检查异常时像遇到运行期异常那样回滚。同样你还可以声明事务遇到特定的异常不会滚,即使这些异常是运行期异常。
二、SpringBoot中实现事务
在SpringBoot中实现事务是比较简单的,具体列子如下:
@Transactional可以作用在类上也可以作用在方法上
1、事务的特点
原子性:事务是一个原子操作,由一系列的动作完成,这一系列动作要么全部完成,要么全部都不完成。
一致性:一旦事务完成,事务建立的业务必须处于一致状态。
隔离性:针对很多事务处理相同的数据,事务之间必须隔离起来,不能够产生数据之间的相互影响。
持久性:一旦事务完成,那么事务建立的状态必须长久的保留下去,不能够相互影响。
2、基本事务属性定义
事务属性是什么?事务属性可以理解成事务的一些基本配置,表示了事务属性如何运用到方法上。
(1)事务的第一个行为是传播行为,当事务被另一个事务调用的时候,必须指定事务应该如何传播。例如方法可以在现有事务中运行,也可以开启一个新事务。Spring定义了七种传播行为,如下:
PROPAGATION_REQUIRED:表示当前方法必须在事务中运行,如果当前事务存在,就在当前事务中运行,如果不存在,则从新开启一个新事务。
PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,如果当前事务存在,则在当前事务中运行。
PROPAGATION_MANDATORY:表示当前方法必须在事务中运行,如果事务不存在,则会抛出异常。
PROPAGATION_REQUIRED_NEW:表示当前方法必须在自己的事务中运行。如果一个新的事务将被启动。如果存在当前事务,当前事务将被挂起。
PROPAGATION_NEVER:表示当前方法不应该运行在失误上下文中,如果存在当前事务,则会抛出异常。
PROPAGATION_NESTED:表示如果已经存在一个事物,那么该方法会嵌套在事务中运行。嵌套事务可以独立于当前事务单独地进行提交和回滚。
在此注意区分PROPAGATION_REQUIRED_NEW和PROPAGATION_NESTED,前者的两个事务,外层事务和内层事务是相互独立的两个事务,也就是内层事务的回滚不会影响外层事务,同时外层事务的回滚也不会影响内层事务。而对于后者,内层事务是依赖于外层事务的,也就是内层事务的回滚不会造成外层事务的回滚,而外层事务的回滚要造成内层事务的回滚。
(2)隔离级别
事务的第二个级别就是隔离级别,隔离级别定义了一个事务受其他并发事务的影响程度。
并发事务通常可能引起如下的问题:
脏读:脏读发生在一个事务读取了另一个事务改写了但是还没有提交的数据,那么这个时候如果另一个事务对数据进行了回滚,事务读取的数据就是无效的。
不可重复读:不可重复读是一个事务执行相同的查询两次以上,但是前后两次读取到的数据是不相同的,那是因为在两次读取数据的间歇中间,另一个事务对数据进行了修改。
幻读:幻读和不可重复读类似。发生在一个事务读取了几行数据,另一个事务又插入了几行数据,在随后的查询中将会发现数据发生了改变。
不可重复读和幻读的区别在于不可重复读重在修改,而欢度在于添加和删除。
具体的隔离级别如下:
ISOLATION_DEFAULT:使用数据库后端默认的隔离级别。
ISOLATION_READ_UNCOMMITED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读。
ISOLATION_READ_COMMITED:允许读取并发事务提交的数据变更,可以防止脏读,但是不能够阻止不可重复读和幻读。
ISOLATION_REPEATABLE_READ:对同一字段多次读取的结果是一样的,除非事务本身修改了数据。可以防止脏读和不可重复读。
ISOLATION_SERIALIZABLE:最高的隔离级别,可以防止脏读、不可重复读和幻读。
(3)事务的只读属性
事务的第三个特性是它是否为只读事务。如果事务只对后端的数据库进行该操作,数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。
(4)事务超时
为了使应用程序很好地执行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要地占用数据资源。事务超
时是事务的一个定时器,在特定的时间内事务如果没有执行完毕,那么久自动回滚,而不一定等待其结束。
(5)回滚规则
事务五边形的最后一组规则,这些规则定义了那些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查异常时不会回滚(这一行为与EJB的回滚行为是一只的)
但是你可以声明事务在遇到特定的检查异常时像遇到运行期异常那样回滚。同样你还可以声明事务遇到特定的异常不会滚,即使这些异常是运行期异常。
二、SpringBoot中实现事务
在SpringBoot中实现事务是比较简单的,具体列子如下:
@Transactional(rollbackFor = {Exception.class}, propagation = Propagation.REQUIRES_NEW,isolation = Isolation.DEFAULT) @Override public void addUsers() throws Exception { for (int i = 0 ;i<10;i++){ User user = new User("test"+i,10+i,"test"+i+"test"); userMapper.addUser(user); if (i == 11){ throw new Exception(); } } }
@Transactional可以作用在类上也可以作用在方法上
发表评论
文章已被作者锁定,不允许评论。
-
Spring BeanFactoryPostProcessor和BeanPostProcessor的区别
2018-11-14 15:40 705链接:https://blog.csdn.net/caihai ... -
spring BeanPostProcessor理解
2018-11-14 11:31 321链接:https://blog.csdn.net/ginkgo ... -
Spring 源码解析之Initializer
2018-11-14 11:27 456链接:https://blog.csdn.net/ktlife ... -
spring transaction同一个类不回滚解决方法
2018-10-11 10:59 7711.修改配置文件 <aop:aspectj-autopr ... -
Spring @Transaction学习
2018-10-08 10:36 2921.考虑有下面这么一个类 public class Foo ... -
spring mvc i18n国际化学习(spring:message)
2018-06-09 09:35 640spring.xml文件中配置: <!-- 存储区域 ... -
Spring Boot Oauth2.0授权服务器
2018-05-11 14:19 1652什么是OAuth? OAuth(Open Authoriza ... -
Spring Boot @Import注解(将指定类实例注入到IOC容器中)
2018-05-09 10:20 1596SpringBoot 的 @Import 用于将指定的类实例注 ... -
Spring Boot @Conditional注解
2018-05-09 10:15 1815Spring Boot的强大之处在于使用了Spring 4框架 ... -
Spring Boot自定义starter pom实例(/META-INFO/spring.factory文件)
2018-05-09 09:48 1138自定义starter pom 自己实现一个简单的例子,当某个类 ... -
Spring Boot自动配置原理(@Conditional @Import)
2018-04-26 14:45 1338Springboot的自动配置是SpringBoot的关键,主 ... -
Spring Boot优缺点总结
2018-04-16 10:25 1535优点: 1.去除了大量的xml配置文件 2.简化 ... -
Sprint @Query注解的用法(nativeQuery=true/false)(Spring Data JPA)
2018-03-15 16:33 38381. 一个使用@Query注解的简单例子 @Query(val ... -
Spring Boot JpaRepository知识学习(Spring Data JPA)
2018-03-14 11:17 18001.Spring Data所解决的问题 Spring Dat ... -
SpringCloud Hystrix知识学习(防止雪崩效应)
2018-03-13 14:57 929一、Hystrix说明 1.服务雪崩效应:是一种因服务提供者的 ... -
SpringCloud @LoadBalanced注解学习
2018-03-13 09:48 2221当时我们说开启负载均衡很简单,只需要在RestTemplate ... -
Spring Boot配置方式(java配置和注解配置)
2018-03-12 15:09 1109Java配置 从Spring 3.x开始,Spring提供了J ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1621REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
SpringCloud | 第七篇: 高可用的服务注册中心
2018-02-26 14:31 484文章 第一篇: 服务的注册与发现(Eureka) 介绍了服务注 ... -
SringCloud | 第六篇: 分布式配置中心(Spring Cloud Config)
2018-02-26 09:13 411一、简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文 ...
相关推荐
提到的"DengDemo"可能是示例项目的名字,这个项目可能包含了整合SpringBoot和JPA的实例代码,包括实体类、Repository接口、配置文件等,供学习者参考。 总的来说,SpringBoot+JPA的组合极大地简化了Java应用的...
本文将深入探讨SpringBoot与JPA的整合过程以及相关知识点。 首先,我们要理解SpringBoot的核心特性之一是自动配置。在SpringBoot项目中,只需要在`pom.xml`或`build.gradle`文件中引入相关依赖,如`spring-boot-...
- 事务管理器(Transaction Manager):在Spring Boot中,如果检测到JPA或Hibernate,将会自动配置一个`PlatformTransactionManager`实例。 2. **JPA集成** - JPA是Java提供的ORM(Object-Relational Mapping)...
在使用 SpringBoot 结合 Spring Data JPA 搭建项目时,主要涉及以下几个核心知识点: 1. **起步依赖(Starter Dependency)**:SpringBoot 通过 starter 依赖简化了配置,对于 Spring Data JPA,我们需要在 Maven ...
本资源针对的是Spring Boot动态多数据源和JTA(Java Transaction API)分布式事务的实现,对于初学者来说非常实用。下面我们将深入探讨这些知识点。 首先,让我们了解一下Spring Boot的多数据源。在许多业务场景下...
1. **配置文件**:在`application.properties`或`application.yml`中,可以通过`spring.datasource`配置数据源,`spring.jpa.hibernate.ddl-auto`设置数据库自动建表策略,以及`spring.transaction.rollback-on-...
### JPA基础知识 #### JPA概述 JPA(Java Persistence API)是一套由Sun Microsystems引入的标准,用于Java应用中的对象/关系映射(Object/Relational Mapping,简称ORM)。它支持两种元数据形式:XML和JDK 5.0注解...
这里涉及到事务管理,SpringBoot配合Spring Transaction可以确保数据的一致性。 4. 支付功能:如果系统支持在线支付,那么会涉及到第三方支付接口的集成,如支付宝或微信支付。这部分需要处理异步回调、状态同步等...
本项目通过SpringBoot构建了一个完整的月度员工绩效考核管理系统,涵盖了后端开发的多个关键知识点,包括SpringBoot核心特性、数据库设计、RESTful API、权限控制、缓存策略、日志管理和部署优化等,为学习者提供了...
【标题】"springboot429校运会管理系统pf.zip" 涉及的主要知识点是基于Spring Boot构建的校运会管理系统。Spring Boot是Java领域一个流行的应用框架,它简化了Spring应用程序的初始设置和配置,使开发人员能够快速...
【核心知识点】 1. **Spring Boot基础** - **自动配置**:Spring Boot通过`@EnableAutoConfiguration`注解自动配置各种组件,极大地减少了开发者手动配置的工作量。 - **起步依赖**:Spring Boot通过“起步依赖”...
总的来说,"SpringBoot082在线宠物用品交易网站的设计与实现"是一个涵盖Web开发全栈的项目,涉及到了前端与后端的交互、数据库设计、安全性、支付集成等多个重要技术领域,对于学习和实践SpringBoot开发的人员来说,...
5. **事务管理(Transaction Management)**:Spring提供了声明式和编程式的事务管理。`@Transactional`注解可以方便地在方法级别声明事务边界。 6. **数据访问集成(Data Access Integration)**:Spring支持JDBC...
6. **@DataJpaTest**:用于JPA实体和仓库的测试,它会自动配置一个内存数据库(如H2)和JPA相关配置,方便进行数据访问层的测试。 7. **Transaction Management**:Spring测试默认在一个独立的事务中运行每个测试...
3. **数据访问**:可能涉及Spring Data JPA和Hibernate,讲解如何操作数据库,包括实体(Entity)、Repository接口、事务管理(Transaction Management)等。 4. **RESTful API设计**:如何使用Spring Boot构建符合...
这个功能通常涉及到以下几个关键知识点: 1. **Spring Boot MVC**:Spring Boot 的 Web 依赖提供了 Spring MVC 框架,用于处理 HTTP 请求。在这个应用中,我们需要创建 RESTful API 接口,接收用户的点赞请求并更新...
在本课程“cursos-alura-adrici”中,学员将深入学习如何构建基于Java、SpringBoot和Hibernate的Web应用程序。这些技术是现代企业级应用开发的重要组成部分,尤其是在Java生态系统中。下面我们将详细探讨这三个核心...
总结,图书座位管理微信小程序综合运用了微信小程序开发技术、MySQL数据库、SpringBoot后端框架,以及RESTful API设计等多方面知识,实现了高效、便捷的图书馆座位管理服务。对于开发者来说,理解和掌握这些技术是...
7. **SpringBoot整合**:现代项目中,SpringBoot简化了Spring和Hibernate的配置,通过自动配置特性,开发者只需少量代码就能实现整合,大大提高了开发效率。 总结,"Spring Hibernate Example"是一个典型的Java Web...