复盘工作2025-01-12
1.通过在A方法中创建新线程,新线程里调用(已定义为新开启事务的)B方法来实现B方法代码里能读到A方法里insert的数据:
/** * 1.问题: * 业务方法B里执行insert语句插入数据库设备表后,调用方法A,方法A里查视图(视图会查设备表)获取数据后生成二维码。 * 但实际测试A方法里查视图无法查到新插入的设备,进而无法执行后续生成二维码逻辑。 * 2.解决方案: * 在方法B中执行insert语句插入数据库设备表后,启动一个新线程,线程等待3秒后,调用方法A,同时将A方法定义为开启新的事务( * 这点通过给A方法加上@Transactional(propagation = Propagation.REQUIRES_NEW)来实现)。 * 3.分析: * 3.1原方案失败原因: * (1)在默认情况下,spring中事务管理器(如DataSourceTransactionManager)使用数据库的事务隔离级别。 * 大多数数据库默认使用“读已提交(read committed)隔离级别”。 * (2)当方法A执行insert语句时,这条语句会开启一个事务,并且在这个事务提交之前,插入的数据对其他事务时不可见的。 * 原来方法B里直接调方法A,由于B和A在同一个事务中运行(如果没有特别指定事务传播行为), * 执行方法A时,方法B的insert语句并没有提交,所以造成A方法里视图查设备表不到设备。 * (3)默认情况下,如果方法在同一个事务上下文中被调用(即没有指定@Transactional的propagation属性),它们将共享同一个事务。 * 3.2解决方案分析: * 将方法A加上注解@Transactional(propagation = Propagation.REQUIRES_NEW)注解后,该方法会在全新的事务中运行, * 与方法B所在事务是互不干扰的。同时在B方法启动新线程后延时3秒,有助于确保这时B方法的事务已提交 * (即insert语句已提交)。从而使方法A里视图能查出刚入库的设备。 */
标签:语句,insert,事务,01,视图,2025,线程,方法,复盘 From: https://www.cnblogs.com/pingfanliliang/p/18667471