- 浏览: 323187 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (254)
- java (178)
- tomcat (6)
- 邮件 (1)
- smtp (1)
- Linux (2)
- 编码 (2)
- 导入工程 (1)
- Specification Level (1)
- hibernate (10)
- 字段类型 (1)
- 字段类型匹配 (1)
- 数据库 (3)
- sql (9)
- struts2 (8)
- 类型转换 (2)
- java,MyEclipse,SVN (1)
- Myecplise (4)
- 输入校验 (1)
- JFrame (2)
- Oracle (8)
- google (1)
- Swing (3)
- Fusioncharts (1)
- 找工作 (0)
- js (4)
- jsp (11)
- displaytag (1)
- spring (8)
- 工作 (1)
- String (1)
- 算法 (2)
- IO (1)
- xml (3)
- 设计模式 (1)
- UML (1)
- 文档 (1)
- ajax (1)
- 日常 (7)
- sql server (1)
- mysql (3)
- git (1)
- Maven (1)
- mongodb (1)
- postman (1)
最新评论
http://blog.csdn.net/huilangeliuxin/article/details/43446177
以上一系列文章
比如Serveice里面的某个受写事务控制的方法A里面可能会调用其他service里的B方法(此方法也是受事务控制的),也可能会调用Dao里的某些方法。
其实,说白了,所有的业务上的事务底层都是数据库事务实现的。
受事务控制的方法里面所有地方用的数据库连接都是同一个,A和B是否走同一个事务有几种情况可能出现:
1、如果A受事务控制,B不受事务控制,则B肯定会跟着A走同一个事务。
2、如果A受事务控制,B也受事务控制,则B是否和A走同一个事务是根据配置的事务传播特性决定的(一般是Spring的配置文件里配置的),最常见常用的配置是propagation="REQUIRED",
这个配置就表示A方法里面所有调用的其他service里的方法或Dao里的方法,都是和A走的同一个事务。
当然,如果把propagation配置成其他属性,会出现A和B各自用不同的事务,也就是说A和B分别开启事务,这种的就会存在一种情况就是,程序在A里面执行开启一个事务,当执行到B又单独
开启一个事务,之后B执行完了,A再继续执行,此时A报错了,A进行回滚,但是由于B和A的事务是分开的,所以B不会回滚,这就相当于不是所有的业务逻辑都回滚了,还差一部分,而那一部分
自己恢复不了了,还得想其他办法。
A和B到底走一个事务还是走两个事务,是根据配置的事务传播特性决定的,咱们当前配置的都是REQUIRED,这种的A和B都是走同一个事务的。
假如B在执行的过程中抛异常或报错了,但是B自己捕获处理了,这种的就不会报错,会继续往下执行,事务也不会回滚。
假如B在执行的过程中抛异常或报错了,但是B没有处理,直接抛出了,抛给A了,A也可以进行捕获处理,
如果A捕获处理了,那事务不会管,继续往下执行,如果A没有捕获,继续往上抛,从A这个方法里抛出去了,抛给上层,这种的A事务就会直接回滚。
说白了,也就是说,无论什么情况,只要从A方法里直接抛出异常或错误了,那么对应A的那个事务直接就会回滚。如果出错了,但是在A里面自己捕获处理了,这种的事务不会回滚,继续往下执行。
但是假如A里面出现了远程服务调用(http或hessian调用),这种的如果在执行的过程中远程调用出现问题抛出异常或抛出错误(http调用或hessian调用抛出异常或错误),这种的如果在A里面
没有捕获处理的话那就会直接在A方法抛出异常,抛给上层,这种的A对应的事务会回滚,A里面不涉及远程调用的其余的业务都能回滚,但是远程调用里面的已经改过的业务就回滚不了了,因为
在远程他也不知道自己要回滚,也没有办法回滚。这种的一般处理方式有下面几种:
1、也有处理的策略是,先让远程操作成功,然后本地操作。本地失败,调用远程失败接口(必须提供远程的失败回滚接口)。这种是要求比较严格的那种。就是这次操作必须两边一致。
2、另一种方式是,假设我A系统成功了,然后我就想办法让B执行成功。如果失败了,我通过定时任务或者队列,一直调用直到成功结束。
这里会配置只要继承exception的异常被抛出,都要回滚
可以多看看慕课网上关于事务的视频。沈寻
以上一系列文章
比如Serveice里面的某个受写事务控制的方法A里面可能会调用其他service里的B方法(此方法也是受事务控制的),也可能会调用Dao里的某些方法。
其实,说白了,所有的业务上的事务底层都是数据库事务实现的。
受事务控制的方法里面所有地方用的数据库连接都是同一个,A和B是否走同一个事务有几种情况可能出现:
1、如果A受事务控制,B不受事务控制,则B肯定会跟着A走同一个事务。
2、如果A受事务控制,B也受事务控制,则B是否和A走同一个事务是根据配置的事务传播特性决定的(一般是Spring的配置文件里配置的),最常见常用的配置是propagation="REQUIRED",
这个配置就表示A方法里面所有调用的其他service里的方法或Dao里的方法,都是和A走的同一个事务。
当然,如果把propagation配置成其他属性,会出现A和B各自用不同的事务,也就是说A和B分别开启事务,这种的就会存在一种情况就是,程序在A里面执行开启一个事务,当执行到B又单独
开启一个事务,之后B执行完了,A再继续执行,此时A报错了,A进行回滚,但是由于B和A的事务是分开的,所以B不会回滚,这就相当于不是所有的业务逻辑都回滚了,还差一部分,而那一部分
自己恢复不了了,还得想其他办法。
A和B到底走一个事务还是走两个事务,是根据配置的事务传播特性决定的,咱们当前配置的都是REQUIRED,这种的A和B都是走同一个事务的。
假如B在执行的过程中抛异常或报错了,但是B自己捕获处理了,这种的就不会报错,会继续往下执行,事务也不会回滚。
假如B在执行的过程中抛异常或报错了,但是B没有处理,直接抛出了,抛给A了,A也可以进行捕获处理,
如果A捕获处理了,那事务不会管,继续往下执行,如果A没有捕获,继续往上抛,从A这个方法里抛出去了,抛给上层,这种的A事务就会直接回滚。
说白了,也就是说,无论什么情况,只要从A方法里直接抛出异常或错误了,那么对应A的那个事务直接就会回滚。如果出错了,但是在A里面自己捕获处理了,这种的事务不会回滚,继续往下执行。
但是假如A里面出现了远程服务调用(http或hessian调用),这种的如果在执行的过程中远程调用出现问题抛出异常或抛出错误(http调用或hessian调用抛出异常或错误),这种的如果在A里面
没有捕获处理的话那就会直接在A方法抛出异常,抛给上层,这种的A对应的事务会回滚,A里面不涉及远程调用的其余的业务都能回滚,但是远程调用里面的已经改过的业务就回滚不了了,因为
在远程他也不知道自己要回滚,也没有办法回滚。这种的一般处理方式有下面几种:
1、也有处理的策略是,先让远程操作成功,然后本地操作。本地失败,调用远程失败接口(必须提供远程的失败回滚接口)。这种是要求比较严格的那种。就是这次操作必须两边一致。
2、另一种方式是,假设我A系统成功了,然后我就想办法让B执行成功。如果失败了,我通过定时任务或者队列,一直调用直到成功结束。
这里会配置只要继承exception的异常被抛出,都要回滚
可以多看看慕课网上关于事务的视频。沈寻
发表评论
-
领域精通涉及技术点(不分先后)
2017-12-20 19:35 618Java8 netty jvm kafaka消息队列 上传下载 ... -
计算机各种单位讲解及换算
2017-12-13 13:54 1635我还听过有UK的 一、最小单位:位(bit,缩写为b) 在原 ... -
JAVA字符串格式化-String.format()和MessageFormat的使用
2017-12-05 10:39 1434String.format()常规类型的格式化 Stri ... -
eclipse启动项目常见问题
2017-11-16 17:46 1180今儿遇到了个问题,ecli ... -
字符编码笔记:ASCII,Unicode和UTF-8
2017-10-23 16:37 456讲的太牛逼了: http://ww ... -
emoji简单讲解
2017-10-23 15:17 972emoji处理方式大起底 http://blog.csdn.n ... -
BigDecimal讲解
2017-10-12 15:58 442BigDecimal 由任意精度的整数非标度值 和 32 位的 ... -
eclips 控制台console上不打印信息
2017-09-06 21:53 5791、进windows菜单 -> show view -& ... -
详解RequestMappingHandlerMapping和RequestMappingHandlerAdapter
2017-08-29 17:08 2965http://donald-draper.iteye.com/ ... -
用@ExceptionHandler 来进行切面异常处理
2017-08-29 11:47 2307有时候我们想处理某个类里Controller中抛出的异常怎么搞 ... -
Spring 注解@Component、@Repository、@Service、@Controller区别
2017-08-28 15:27 1009spring 2.5 中除了提供 @Com ... -
线程的一点小总结
2017-08-23 20:36 705java中main方法启动的是一个进程还是一个线程? 答:是一 ... -
线程池
2017-08-23 17:35 518诸如Web 服务器、数据库 ... -
Class源码大概讲解
2017-08-23 16:47 507http://blog.csdn.net/a327369238 ... -
Spring 事务相关
2017-08-14 12:10 471Transactionz注解的readOnly ... -
把时间当做朋友-前言
2017-08-13 20:47 403要管理的不是时间,而是自己。人们生活在同一个世界,却又各自 ... -
单例里面的方法讲解
2017-08-11 14:55 487spring里的controller是单例的。系统针对每个co ... -
eclipse拷贝出来的项目名称还是原来的
2017-07-26 16:46 1076需要修改的有如下几个地方: 1、pom.xml里面打包的名字一 ... -
自定义hibernate方言,新增自定义函数
2017-06-27 10:47 875按位与运算(&)在许多数据库中都是支持的,遗憾的是,H ... -
http请求参数:header body paramter三种参数区别、联系
2017-06-19 10:46 488812345
相关推荐
java-事务 test aa
这个驱动包允许Java程序通过JDBC(Java Database Connectivity)接口连接到MySQL服务器,执行SQL查询、事务处理等数据库操作。 `mysql-connector-java-5.1.27.jar`是该驱动包的核心文件,包含了所有必要的类和资源...
MySQL Connector/J提供了一个接口,使得Java应用程序能够执行SQL语句,处理结果集,管理事务,并实现其他数据库交互功能。 在"mysql-connector-java-8.0.23.zip"压缩包中,主要包含的就是`mysql-connector-java-...
MySQL Connector/J遵循JDBC接口标准,使得Java开发者能够方便地访问MySQL数据库,执行SQL查询、事务处理等操作。 1. **安装与配置**: - 解压`mysql-connector-java-5.1.40.tar`文件,通常会得到一个jar包,例如`...
MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,允许Java开发者在Java应用中访问和操作MySQL数据。`mysql-connector-java-5.1.44`是这...
9. **事务处理**:从MongoDB 4.0开始,Java驱动程序支持多文档ACID事务,这对于需要跨多个文档的原子操作非常有用。 10. **异步编程**:从3.2版本开始,驱动程序提供了异步API,利用Java 8的CompletableFuture,...
MySQL Connector/J是MySQL数据库系统与Java应用程序之间的重要桥梁,它是一个实现了JDBC(Java Database Connectivity)规范的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。"mysql-...
开发者在Java程序中引入这个JAR文件,就能通过JDBC API与MySQL服务器进行通信,执行SQL查询、事务处理等操作。 标签"mysql-connector-"是对该文件类型的识别,表明这与MySQL的JDBC驱动有关。 压缩包内的文件包括:...
- 回滚和提交事务:支持ACID(原子性、一致性、隔离性和持久性)事务管理。 - 错误处理和诊断:提供详细的错误信息和诊断工具。 - 国际化:支持多种语言和字符集。 在实际开发中,`mysql-connector-java-5.1.47.jar...
这个驱动实现了Java.sql和javax.sql接口,使得开发者能够在Java程序中执行SQL语句、处理结果集、管理事务等操作。 在描述中提到的"mysql-connector-java-5.1.7"是该驱动的版本号,表示这是MySQL Connector/J的一个...
它包含了必要的类和资源,使得Java应用能够识别并连接到MySQL服务器,处理SQL查询,执行事务,以及管理数据库连接。这个版本的驱动兼容MySQL 5.1.x版本的数据库服务器。 在实际使用中,首先需要将压缩包解压。`._...
MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的驱动程序,允许Java开发者在Java应用中访问和操作MySQL数据库。`mysql-connector-java-8.0.11....
3. **事务支持**:支持ACID(原子性、一致性、隔离性、持久性)事务,确保数据处理的可靠性和一致性。 4. **连接池**:通过集成流行的连接池实现,如C3P0、HikariCP或Apache DBCP,可以有效管理数据库连接,提高...
MySQL Connector/J支持多种功能,包括事务处理、预编译语句、批处理以及JDBC的其他高级特性。 3. MySQL 8.0.21: 这是MySQL数据库的一个特定版本,包含了性能改进、新功能和错误修复。例如,8.0版本引入了增强的JSON...
MySQL Connector/J 8.0.23 是一个用于Java应用程序的数据库驱动程序,它使得Java开发者能够连接到MySQL数据库服务器并执行SQL操作。这个jar文件是MySQL官方提供的,确保了与MySQL服务器的兼容性和稳定性。在Java环境...
3. **事务处理**:支持ACID(原子性、一致性、隔离性和持久性)事务特性,确保数据的一致性和完整性。 4. **批处理**:允许一次性提交多条SQL语句,提高执行效率。 5. **结果集处理**:返回查询结果,支持遍历、...
这个驱动程序符合JDBC接口规范,使得Java开发者可以使用标准的JDBC API来与MySQL进行交互,包括创建数据库连接、执行SQL查询和更新、管理事务等。 `mysql-connector-java-5.1.27.jar`中的主要知识点包括: 1. **...
- **数据传输**:MySQL Connector/J实现了JDBC接口,使得Java开发者能够通过标准的Java SQL API与MySQL数据库进行交互,包括执行SQL语句、处理结果集、事务管理等。 - **兼容性**:8.0.16版本兼容Java SE 8及以上...
4. **事务管理**:支持JDBC的事务特性,包括自动提交、手动提交、回滚和保存点。 5. **数据库元数据**:提供DatabaseMetaData接口,可以获取关于数据库、表、列等元数据信息。 6. **批处理**:允许一次发送多个SQL...