2.2 创建第三方账单(
以"A服务"流水号作为主键
) (jpa save)
2.3 响应 "A服务" 请求
3. "A服务" 在未接收到响应的同时,再次请求 "B服务" 发起
创建账单
;
预期:“B服务 ”应有 "2条第三方账单",但实际只有
最后一步骤的数据,前面的数据丢失。
从上述情况,就可以看出。JPA 的
save 不等于 INSERT INTO 。
分析1:
第一次创建的第三方账单,使用 "
流水号
" 作为主键,将数据保存下来;
分析2
:第二次创建时,"
同一流水号
" 作为主键保存时,发现已经存在,则更新并替换数据。
事实
: save 并没有失效,而是它具有插入和更新的能力。
办法1
:使用明确的SQL , 执行Insert Into 语句,从本质上解决,后续被捕获异常。
办法2
:通过锁的方式,先查询没有再save。(对于大量并发并不适用哦)
办法3
:通过缓存中间件,例如 Redis 等,但弊端受限于网络。服务集群可以这样处理。
** 希望得到你的参与和支持。 如果内容有描述不恰当的地方,请指出。 谢谢!**
最近使用
Jpa
Repository方法,发现有个字段一直没有修改成功;
最后发现实体类加了注解updatable = false,如下
@Column(name = "patient_package_id", length = 64, updatable = false)
private String patientPackageId;
updatable = false意思是更新操作时候,不会对该字段进行修改;(稍微不注意就掉坑里了)
最后,个人建议:还是少用
Jpa
Repository,还是手写
@EnableTransactionManagement
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplica...
近日朋友项目出现了一个问题,就是使用
JPA
的save方法进行DB保存,即使出现错误,也不希望事务回滚(但是如果这样不应该不加事务注解么?),但是使用过程中发现即使catch住异常,事务依然回滚了,
经过调试,调用save方法后根本不走catch代表块,通过debug观察SQL打印时间,发现调用save方法后,并没有出现SQL语句在日志中,而是等业务方法执行完毕后,才打印SQL语句并出现异常,
异常则被代理类捕捉了,由于
JPA
做了很多优化,根据调用save方法不及时打印SQL来看,极有可能是
JPA
为了节省
@RequestMapping("/
jpa
test")
public String
jpa
Test(ModelMap modelMap){
userRepository.save(new User("python","123456","xxxxx@126.com"));
List<User> users = userRepository.findAll();
modelMap.put("users", users);
return "
jpa
test";
* 输出字符串测试
* http://localhost:8080/helloboot
* @return
@RequestMapping("/hellotest")
public String helloTest(){
return "Hello!";
* htmltest
* @return
@RequestMapping("/htmltest")
public String test(){
return "login";
* 测试 Model
* spring自动为Model创建实例,并作为controller的入参
* @param model
* @param name
* @return
@RequestMapping("/modeltest")
public String testVelocity(Model model, String name){
if (name==null ||name.isEmpty()){
name ="您没有输入名字!";
model.addAttribute("name", name);
return "modeltest";
* 测试 ModelAndView
* @param name
* @return
@RequestMapping("modelandview")
public ModelAndView testModel(String name) {
if (name==null ||name.isEmpty()){
name ="您没有输入名字!";
//构建ModelAndView实例,并设置跳转地址
ModelAndView view = new ModelAndView("modelandviewtest");
//将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型
view.addObject("name", name);
//返回ModelAndView对象view
return view;
Java-SpringBoot-@
Transactional
-事务注解的
失效
和不回滚的场景
事务(Transaction)指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
SpringBoot 通过 @
Transactional
注解大大简化了开发时事务使用的复杂度,但同时也引入了不少隐藏的坑。
使用不当会引起事务
失效
、不能回滚等情况,从而破坏记录的完整性。
我们梳理下导致事务
失效
的常见错误避免踩坑。
Spring Boot (v2.6.7)
ORM
JPA
数据库驱动
相信大家在日常工作中也都曾遇到过@
Transactional
注解
失效
的情况,今天我来总结下@
Transactional
注解
失效
的6中情况。
1.方法是非public修饰的
解决方法: 改成public修饰。
2.异常被捕获了,没有抛出
解决方法: 直接抛出需要回滚的异常,不要try-catch住。
3.方法内部直接调用
代码示例:
4.新开启一个线程
5.数据库本身不支持
6.事务传播属性设置错误,如设置了:PROPAGATION_NOT_SUPPORIED(以非事务的方式执行,如果当
在使用
JPA
时,可以通过重写save方法来实现自定义的保存逻辑。在@Enable
Jpa
Repositories注解中,可以指定要扫描的repository包,并使用repositoryBaseClass参数指定重写的save类。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [
jpa
之动态插入与修改(重写save)](https://blog.csdn.net/qq_34874784/article/details/104846923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [Spring Data
JPA
批量插入过慢及其优化 —— 自定义Repository](https://blog.csdn.net/tfstone/article/details/113741890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [springboot
jpa
mysql controller演示](https://download.csdn.net/download/codepython/10577688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]