在多线程的情况下,我们经常会用到synchronized或者Lock来保证我们的线程安全。
但是当碰到Transcational之后又会碰撞出什么火花呢?
相信我,看完之后,你一定不会亏
首先回顾一下小知识点:
基于@Transactional注解的是 声明式事务
spring还提供了另外一种创建事务的方式,即通过手动编写代码实现的事务,我们把这种事务叫做:编程式事务。
数据库连接本来默认是自动提交的,加上注解Transactional之后,会设置为手动提交。
自动提交意味着 每当我们执行一个update ,delete或者insert的时候都会自动提交到数据库,无法回滚事务。
下面我们来看一个例子:
这个方法的执行流程是这样的。
很显然,涉及库存和订单,都会对数据库进行操作,且应该是应该原子性的操作。
所以我们在方法上加了一个 @Transactional 注解。
接着我们用Jmeter进行并发测试 15个线程 抢购数据库现有的10个库存。
执行完之后,我们发现本来10台库存,现在15个人居然都抢到了,还剩了2台。
真是离谱Mother给离谱开门,离谱到家了。此刻我真的想说,I love you Mother。