NutzCN Logo
问答 dao.execute前者执行insert语句,后者执行SELECT LAST_INSERT_ID,那么后者获取到的一定是前者的id吗?
发布于 2073天前 作者 qq_90d2aba0 1696 次浏览 复制 上一个帖子 下一个帖子
标签:

如题,假设现在只有一个A对象,调用了dao.execute(insertSQL,SELECT LAST_INSERT_ID),那么SELECT LAST_INSERT_ID获取的是MySQL数据库为insertSQL生成的id的值,这样是没有问题的。
在高并发情况下,假设现在有两个对象A、B,现在A调用了dao.execute(insertSQL,SELECT LAST_INSERT_ID),先执行了A的insertSQL,A的SELECT LAST_INSERT_ID还没有执行,此时CPU执行B,A停止执行,B的insertSQL执行结束以后,CPU又执行了A,那么现在执行的就是A的SELECT LAST_INSERT_ID,那么这个返回值是MySQL为A生成的id,还是MySQL为B生成的id

7 回复

事务不就是要确保这种事情的嘛?

我说说我对事务的理解,事务是一个容器,他将各个操作包装在里面,但是对外看来是一个而不可分割的最小单位。按照这样理解的话,那么上面的这种情况是可能出现的啊

A的操作还是没有被分隔,B的操作也没有被分隔,但是我担心最后的结果可能会出现问题

Trans.exec最高级别事务试试?

@wendal 我刚才去看了一下这个东西,确实这个东西可以实现,而且感觉这一类问题只能将事务的级别设置成为最高级别,也就是串行化,才能够解决这个问题,但是一旦设置成为串行化,那么就不允许并发,这样数据库的效率又会大大的下降

外部生成id嘛,就没这种问题了

添加回复
请先登陆
回到顶部