多线程事务解决方案

@Transtional 的实现原理

创建了个了代理对象,然后它就会帮我们创建事务,然后执行方法,最后提交事务,方法报错就可能回滚事务

涉及到事务嵌套场景,默认的事务传播机制为 外层有事务就沿用外层的事务,没有内层就新建事务

而事务是基于JDBC的connection来实现的,当创建事务时,会把connection放到ThreadLocal里。然后内层方法就会去从ThreadLocal拿到connection对象,实现对事务的控制

但由于ThreadLocal每个线程都是独立,那么@ Transitional 在多线程情况下就会失效了。

而我们要解决这个,无法就是解决线程之间connection无法传递的问题。

TransactionSynchronizationManager+方法加注解 @Transactional

缺点就是 事务粒度太大了

1
2
3
4
5
6

ConnectionHolder connectionHolder=(ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);




2PC

成绩分析引入多线程后 事务问题的最终解决方案:

分析内容表脏了没关系,在分析总记录表中加一个字段为status:0表示进行中,1表示已完成

如果分析过程中出错了,那分析记录状态就会一直为0,进行中是不能被查看的,只有已完成的分析才能被查

看。后续会开一个定时任务每天 凌晨 根据分析记录时间和状态去把脏数据清空,即把前天的脏数据清空

类似于事务的两阶段提交