分享职场生活、职场攻略、程序员创业资源,为一线开发者提供优质内容
张工是一名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分钟要扣钱,加班两小时没加班费”
更多精彩,请扫二维码关注小爱