分享职场生活、职场攻略、程序员创业资源,为一线开发者提供优质内容

张工是一名java程序员,最近到某互联网公司面试,面试官问了这样一个问题:

有这样一个场景,需要往订单主表和明细表插入数据,如何保证订单主表和明细表数据完整性。

张工说,“数据完整性可以用订单号关联。”

面试官: 可能是我问的不是很清楚,如何避免主表插入成功,明细表插入失败。

张工一时间不知所措,因为张工没有平时没有做过类似的功能。

面试官又看了看张工的简历,说:你都做过好5-6个项目了,怎么连事务机制都没有用过。被面试官这么一说,张工有点不好意思了,自己平时在项目中确实没有用过。

其实面试官问这个问题就是考察事务的特性:

事务具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。

  • 原子性(atomicity) 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性(consistency)事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

接下来我们来看看怎么在Spring Boot实现事务,其实在Spring Boot实现事务并不复杂,很简单,一个注解@Transactional就可以了。

pom.xml配置

Spring Boot中实现事务Jar包,还是基本的数据库访问包,比如mybatis

    org.mybatis.spring.boot    mybatis-spring-boot-starter    1.3.2    mysql    mysql-connector-java    5.1.37

注解事务@Transactional

@Servicepublic class UserService {   @Autowired    private UserMapper userMapper; @Autowired    private CompanyMapper companyMapper;    @Transactional(rollbackFor = {RuntimeException.class, Error.class})    public void saveUserInfo(User user) {        Company company = new Company();        company.setName("xiaoai:" + user.getUserName());        companyMapper.insertCompanyInfo(company);        userMapper.insertUserInfo(user);    }}

注解属性

rollbackFor:触发回滚的异常,默认是RuntimeException和Error

isolation: 事务的隔离级别,默认是Isolation.DEFAULT

这样就完成了。关于事务配置,有人说得在@SpringBootApplication上添加注解@EnableTransactionManagement,我配置的时候发现不用配置,也能达到效果。

需要注意是在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

总结:

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务;
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行;
  • 事务用来管理 insert,update,delete 语句。

由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。

springboot 手动提交事务_面试官你都工作3年了,也做过5个项目了,怎么连事务机制都不会...相关推荐

  1. springboot 手动提交事务_分布式事务开局第一篇,从数据库事务隔离级别说起

    春节临近,松哥也有点无心撸码.不过很多时候,很多事情,我们不能由着自己的性子,还是要控制一下自己,这不,松哥最近又打算开一个坑,和大家聊一聊分布式事务,因为我们做微服务,分布式事务肯定是跳不过去的坎. ...

  2. .jar中没有主清单属性_面试官问:为什么SpringBoot的 jar 可以直接运行?

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 来源 | https://urlify.cn/uQvIna SpringBoot提供了一个插件spring-boot-mav ...

  3. @data注解不生效_面试官:你经常在SpringBoot中使用的条件注解底层是如何实现的?你了解过吗?...

    SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation).比如@ConditionalOnBean.@ConditionalOnClass.@Conditio ...

  4. rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

    作者:mousycoder segmentfault.com/a/1190000021054802 消息队列连环炮 项目里怎么样使用 MQ 的? 为什么要使用消息队列? 消息队列有什么优点和缺点? k ...

  5. golang实现的布隆过滤器_面试官:都 2020 年,你在干嘛?还不知道布隆过滤器

    关注过 @Python大星 的小伙伴应该知道,2020 年 4 月 Python 小星最近裸面了阿里巴巴菜鸟网络科技有限公司. 一面中面试官非常重视解决 Redis 缓存穿透问题的利器--布隆过滤器, ...

  6. 启动rrt什么意思_面试官:你来说一下springboot启动时的一个自动装配过程吧!...

    前言 继续总结吧,没有面试就继续夯实自己的基础,前阵子的在面试过程中遇到的各种问题陆陆续续都会总结出来分享给大家,这次要说的也是面试中被问到的一个高频的问题,我当时其实没答好,因为很早之前是看过spr ...

  7. mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)

    本内容来源于和尚 16 年毕业的学长,先在 58,后阿里,如今准备跳槽了,以下内容为他的最近面试经历 我最近从大厂离职之后在合肥呆了个把月,之前已经准备了半个多月,从7月底开始投简历面试,目前是jav ...

  8. swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...

    面试官:虫虫你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗? 虫虫:我只知道这是用来缓存sql查询的数据 面试官:没了? 虫虫:没了 面试官:公司门知道在哪里吧 自己走还是我 ...

  9. 哈希表查找失败的平均查找长度_面试官:哈希表都不知道,你是怎么看懂HashMap的?...

    本文作者 作者:马可没有菠萝 链接: https://juejin.im/post/6876105622274703368 本文由作者授权发布. HashMap是Java面试中的必问考点之一,网上关于 ...

最新文章

  1. DevExpress —— dxDataGrid
  2. ActiveMQ消息队列的使用及应用
  3. app.vue里使用data_Yeoman自定义Generator使用案例及Plop的使用
  4. jquery中的load()方法使用要点
  5. mysql insert replace_mysql 操作总结 INSERT和REPLACE
  6. JNDI学习总结(4)——Tomcat下使用Druid配置JNDI数据源
  7. 匿名对象方案与实体对象方案对比
  8. 人物和背景分离的快速方法
  9. vue-cli 搭建的项目处理不同环境下请求不同域名的问题
  10. ARP协议具体解释之Gratuitous ARP(免费ARP)
  11. ubuntu20.04 cudnn7.5.6_每日一题|小学数学1——6年级天天练习
  12. C读取INI的代码实例
  13. 在字符串中查找id值MySQL
  14. RestClient 接口测试实践
  15. Msfconsole爆破ssh
  16. m-bom,p-bom,e-bom 这是什么意思
  17. VBA快速转换数据格式,将CBOT结算价历史数据导入数据库(图文)
  18. 最新调研-持续集成和持续交付解决方案市场现状研究分析与发展前景预测报告
  19. python教学小说05 宽容之心,是容纳世界的神奇变量。
  20. 红米k30至尊版是5g吗 红米k30至尊版怎么样

热门文章

  1. 【Flink】Class class org.apache.flink.types.Row cannot be used as a POJO type because not all fields a
  2. 95-241-100-源码-Flink语义-Flink的exectly-once系列之两阶段提交概述
  3. 【MySQL】MySQL删除数据库的时候卡死
  4. volatile是Java提供的一种轻量级的同步机制
  5. IDEA中Git合并冲突
  6. vue父组件变量传递子组件_Vue.js 父组件向子组件传递数据通过 props
  7. 源码角度,分析@Transactional实现原理
  8. Spring 为啥默认把bean设计成单例的?这篇讲的明明白白的
  9. oracle到pg不停机增量迁移,研究 Oracle 到 PostgreSQL 的数据迁移 – 以 pgloader 为例 – Phy 的博客...
  10. Wireshark抓包工具使用