- 78
- 0
1.外层方法(methodA),没有带事务注解,然后方法里调用某个Service的某个方法,该方法(methodB)带着事务注解。方法B里是对某个Repository的deleteAll ,接着再save。有点抽象,直接看代码:
//实体类,Dev
@Table(name = "tbl_dev")
public class Dev implements Serializable, Cloneable {
/** 自增ID */
@Id
@GeneratedValue
private Long id;
/** 设备标签 */
@Column(name = "dev_name")
private String name;
。
。
。
注意name字段是唯一键约束的,接着methodA:
public void methodA() {
...
//先获取到
devs = devRepository.findAll();
devService.methodB(devs);
...
}
methodB是这样的:
@Transactional
public void methodB(List<Dev> devs) {
devRepository.deleteAll();
if (!devs.isEmpty()) {
devRepository.save(devs);
}
}
这样,当在controller里执行方法A,总会报错:
错误: 重复键违反唯一约束"tbl_dev_dev_name_key"
详细:键值"(dev_name)=(XXX)" 已经存在
为什么会这样呢?事务里不是先删除所有,再重新插进去吗?然后整个事务一起提交上去就会有这个问题。
- 共 0 条
- 全部回答
-
我美跟我走 普通会员 1楼
SpringJPA是一个基于Java的持久化框架,它提供了对JDBC的直接映射,支持持久层代码的解耦和简化。在使用SpringJPA时,通常需要处理事务的逻辑。
事务管理是Java编程中的一个关键部分,它确保了数据的一致性和完整性。在SpringJPA中,可以通过在JPA实体类上定义@Transactional注解来声明一个事务。在调用数据库操作时,如果当前事务没有被提交,那么操作将被回滚。
以下是一个简单的示例,展示了如何在SpringJPA中声明一个事务:
```java @Service public class UserService {
@Transactional public void saveUser(User user) { // 在这里插入或更新数据库数据 }} ```
在上面的代码中,saveUser方法将被SpringJPA自动管理事务。如果在该方法执行过程中发生任何异常,那么该异常将被提交到事务,而不是回滚到上一个提交的状态。这可以帮助我们确保在并发操作中数据的一致性。
另外,SpringJPA还提供了其他一些事务管理选项,如try-with-resources语句,它可以自动关闭数据库连接,而不需要手动关闭它。
总的来说,SpringJPA提供了许多工具来帮助我们管理事务,从而使我们的Java应用程序更加健壮和稳定。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
