Spring事务

来源:3-4 优化你的索引-运用B树

奶茶三兄弟d

2019-09-17

老师,我想问下,就是2个请求同时到达一个被事务管理起来的方法中,该方法定义的事务的隔离级别为
读提交级别,传播行为是REQUIRED。
1、那是不是只要有一个请求进来都会开启一个新的事务?
2、在这个方法中,我用synchronized包裹了2个sql查询语句方法,一个是查询某行数据的一个字段值,一个是更新这行数据的那个字段值,
我想下老师,就是如果第一个请求线程先获取到了CPU资源,先进入了synchronized内,此时第二个请求线程等待,此时第一个请求线程做了查询这行数据的字段值,后修又改了这个字段值,接着第一个请求线程走出synchronized代码块,然后第二个请求线程进入了synchronized内,同样也是先查询那个字段值,然后修改那同一个值,那他先查询的值,是否是第一个请求线程更新后的值,还是说查询到的是第一个请求线程更新之前的值,

写回答

2回答

翔仔

2019-09-18

同学好,1.Required:默认的事务传播行为,表示必须有逻辑事务,否则新建一个事务,使用PROPAGATION_REQUIRED指定,表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务:这里说的是同一次请求,不同请求会创建不同事务

2.主要看先获得锁的事务修改字段值了之后,是否已经提交了,如果已经提交了,那么第二个事务就能取到最新的值,否则还是原来的值

0
1
奶茶三兄弟d
老师,这个是否提交,因为当前是事务管理的,那么是否跟synchronized包含的范围有关,如果包含到最后一行执行sql方法的地方,执行完,是否算已经提交事务了,还是说必须是第一个请求直到返回值后,请求结束,才算整个事务已经提交了,对这一块比较模糊,麻烦老师了
2019-09-18
共1条回复

奶茶三兄弟d

提问者

2019-09-18

老师,我做了一个简单的测试,您看下,对嘛

1、第一种情况测试 : synchronized包含到请求结束

//img.mukewang.com/szimg/5d819a9f09e81f1313120692.jpg

如上图,事务二已经读取到了第一个事务更新后的值

日志信息如下图

//img.mukewang.com/szimg/5d819b1609bef04e17120756.jpg

但是也测试到了事务二没有读取到事务一更新后的值(可是事务一已经提交了,为什么事务二还不能读取到更新后的值呢)

如下图

//img.mukewang.com/szimg/5d819b670988dd8d17170773.jpg


第二种情况测试 : synchronized没有包含到请求结束

//img.mukewang.com/szimg/5d819bd7098234af13850599.jpg

//img1.sycdn.imooc.com/szimg/5d819bd70986189d13040576.jpg

//img.mukewang.com/szimg/5d819b1609bef04e17120756.jpg

这种情况下的测试,事务二能读取的到,也会读取不到,我想的是,是不是sychronized包含的范围的问题,

可能事务一请求再走出sychronized代码块后,并没有争抢到CPU的资源,因此请求还没结束,没有执行到return这行语句,

而是事务二的请求争抢到了CPU资源,所以的话,这时候事务二也就读取不到事务一更新后的值了;


麻烦老师看下,都是按照自己想法和理解来的,也不知道是否正确,


0
2
奶茶三兄弟d
回复
翔仔
哈哈,谢谢老师,下午又搞了一遍,看来以为自己懂了,实际上自己是一知半解的,看来自己不捣鼓下,并不能很深刻的去理解,太依赖吃现成的了
2019-09-19
共2条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程