Spring事务
来源:3-4 优化你的索引-运用B树
奶茶三兄弟d
2019-09-17
老师,我想问下,就是2个请求同时到达一个被事务管理起来的方法中,该方法定义的事务的隔离级别为
读提交级别,传播行为是REQUIRED。
1、那是不是只要有一个请求进来都会开启一个新的事务?
2、在这个方法中,我用synchronized包裹了2个sql查询语句方法,一个是查询某行数据的一个字段值,一个是更新这行数据的那个字段值,
我想下老师,就是如果第一个请求线程先获取到了CPU资源,先进入了synchronized内,此时第二个请求线程等待,此时第一个请求线程做了查询这行数据的字段值,后修又改了这个字段值,接着第一个请求线程走出synchronized代码块,然后第二个请求线程进入了synchronized内,同样也是先查询那个字段值,然后修改那同一个值,那他先查询的值,是否是第一个请求线程更新后的值,还是说查询到的是第一个请求线程更新之前的值,
2回答
-
同学好,1.Required:默认的事务传播行为,表示必须有逻辑事务,否则新建一个事务,使用PROPAGATION_REQUIRED指定,表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务:这里说的是同一次请求,不同请求会创建不同事务
2.主要看先获得锁的事务修改字段值了之后,是否已经提交了,如果已经提交了,那么第二个事务就能取到最新的值,否则还是原来的值
012019-09-18 -
奶茶三兄弟d
提问者
2019-09-18
老师,我做了一个简单的测试,您看下,对嘛
1、第一种情况测试 : synchronized包含到请求结束
如上图,事务二已经读取到了第一个事务更新后的值
日志信息如下图
但是也测试到了事务二没有读取到事务一更新后的值(可是事务一已经提交了,为什么事务二还不能读取到更新后的值呢)
如下图
第二种情况测试 : synchronized没有包含到请求结束
这种情况下的测试,事务二能读取的到,也会读取不到,我想的是,是不是sychronized包含的范围的问题,
可能事务一请求再走出sychronized代码块后,并没有争抢到CPU的资源,因此请求还没结束,没有执行到return这行语句,
而是事务二的请求争抢到了CPU资源,所以的话,这时候事务二也就读取不到事务一更新后的值了;
麻烦老师看下,都是按照自己想法和理解来的,也不知道是否正确,
022019-09-19
相似问题