工作3年了,也做过一些项目,可对事务机制还是没有理解透彻

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

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

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

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

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

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

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

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

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

  • 原子性(atomicity) 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

  • 一致性(consistency)事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

  • 隔离性(isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性(durability)持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

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

pom.xml配置

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

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.37</version>
</dependency>

注解事务@Transactional

@Service
public 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 语句。

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

技术交流、媒体合作、品牌宣传,请加小爱微信: iyiyouyou

往期推荐

失败的管理制度:“上班迟到1分钟要扣钱,加班两小时没加班费”

更多精彩,请扫二维码关注小爱

猜你喜欢

转载自blog.csdn.net/X8i0Bev/article/details/108590989