我分析了Spring框架源代码,但我还没理解为什么事务没有正常工作。
我发送了32个线程的请求数据包来调用buySth函数(通过控制器)。我认为插入选择查询在一个事务中工作,所以如果remainingMoney低于1000,那么插入作业将被停止,但结果完全不同。当reaminMoney为零时,插入作业没有停止。
为什么交易是这样的?我搜索了互联网找到原因,但我找不到它。你能给我一些建议吗?
我附上了以下部分代码。
1)ServiceImpl(使用@Transactional)
@Service ("testService")
public class testServiceImpl implements testService{
..........
@Override
@Transactional
public void buySth(String id, int seq) throws Exception {
..........
int result = sqlSession.insert("testMapper.insertTestSth", map);
}
..............
2)映射文件(使用插入选择查询,但选择仅用于检查条件)
<insert id="insertTestSth" parameterType="java.util.HashMap">
insert into dbo.TestSth (id, reductMoney, type, description)
select #{id}, #{reductMoney}, #{type}, #{description}
where (
select sum(nvl (initMoney, 0))-sum (nvl (reductMoney, 0)) as remainMoney
from dbo.TestSth where id = #{id}
) > 1000
</insert>
3)Db默认隔离级别:Read committed