67,539
社区成员
发帖
与我相关
我的任务
分享
流程:
用户发帖------->服务端的Controller----Service----Dao写入Mysql数据库
这种多用户同时发帖,mysql却不会混乱,我们普通开发者写起来就像在写只有一个用户访问数据库一样,它不错乱是因为Spirng和Mysql自己已经处理好了吗?
首先Spring和Mysql没有任何关系,Dao层读写数据只和数据库事务有关系,提交事务数据库就保存数据,没有提交事务数据库的数据就不会发生变化。现在的spring已经很智能,都是框架自动提交事务,所以你感受不到那个过程。
然后你说【多用户同时发帖,mysql却不会混乱】这个说法是错误的,它本身是一定会混乱的。你没有发生混乱有两种原因。
第一,你的帖子主键用的是mysql自动生成的key,你可以尝试把自动生成变成普通的key,然后你通过你的Service调用Dao层的时候生成一个key【大概的逻辑就是读取数据库最后一个id,然后在规则范围内+1】,然后做insert操作。
第二,就是你点击发帖子的按钮速度太慢,并没有在1秒内提交多次。
正确的测试方法如下,
先把自动生成主键去掉,然后你需要在Controller中新写一个方法,然后开启2个多线程同时去调用你写库的那个Controller的方法,然后通过postman或者页面调用你新写的接口,你会发现它会给你报错,提示写入数据库的key重复。因为这两个方法都是在同一秒内触发的,而第一个进来的方法去数据库读取到的最后一个key和第二个进来的方法读取到的key是一样的,就是因为前面的事务还没有提交到数据库,第二个方法就进来了。