1.为什么会在一个事务想到开子线程?
因为在某些场景下,信息提交后在保存的过程中部分信息需要大量时间去写业务逻辑然后获取,然而这部分信息并不要求实时性,所以就想到在一个service下开启子线程处理这块
2.引发问题:一个事务下开启子线程处理业务,是否会开启新的事务,或者共用一个事务?
答案都是否定的。
3.验证流程
验证一:在springdata下测试
由于springdata在update,delete,save操作时强制要求开启事务,所以子线程并没有开启事务
等待足够时间却查不到主线程的未提交事务,所以没有公用一个事务
子线程强开事务解决方案:可以新建一个service,在当前service调用新sevice事务方法,就可以开启新事务
验证二:
在mybatis中,不强制开启事务,所以可以更新成功
重要发现:数据库对于数据的行操作存在共享锁和排他锁
共享锁,又称为读锁,获得共享锁之后,可以查看但无法修改和删除数据。
排他锁,又称为写锁、独占锁。获准排他锁后,既能读数据,又能修改数据。
所以如果一个保存开启了事务,那么更新该条数据就会先等保存事务提交后,才会执行更新(排他锁)