Spring可以支持编程式事务和声明式事务。
Spring提供的最原始的事务管理方式是基于TransactionDefinition、PlatformTransactionManager、TransactionStatus 编程式事务。
而TransactionTemplate的编程式事务管理是使用模板方法设计模式对原始事务管理方式的封装。
之所以分享这个是因为搜Spring多线程情况下保证事务出来一堆使用PlatformTransactionManager来实现多线程事务,一点都不优雅,所以结合他们分享的文章再出来一版,便于搜索。
下面直接就贴案例,至于原理在座的大佬自己研究,咱这就不板门弄斧了。
@SpringBootTest
class SeckillGoodsServiceImplTest {
@Autowired
private SeckillGoodsMapper seckillGoodsMapper;
@Autowired
private TransactionTemplate template;
@Test
public void test() throws InterruptedException {
CompletableFuture.runAsync(() -> {
template.execute((status) -> {
SeckillGoods seckillGoods = new SeckillGoods();
seckillGoods.setId(4L);
seckillGoods.setSkuName("66666666666");
seckillGoodsMapper.updateById(seckillGoods);
//制造一个异常,然后修改没有成功,证明事务已经回滚了,spring yyds
int i=10/0;
return status;
});
});
}
}
图片版:
查看数据库没有修改成功: