事物隔离级别

事物隔离级别

问题:
老师 我有一个疑问:
两个不同的事物A和B,同时对t_goos进行插入操作,
首先A在自己的事物中执行insert操作,插入之前自增得到的t_goods.goods_id=10; 
但是这时候A事物还没有提交,轮到B事物处理;
然后B也在自己的事物中执行insert操作,插入之前自增得到的t_goods.goods_id=?
B事物进行insert操作之前自增得到t_goods.goods_id是多少?
我测试了一下,发现是11,但是不太理解。
我的理解是:A和B事物有隔离性,那么在尚未提交之前A和B自增得到的t_goods.goods_id应该一样。
但是如果一样,必然就导致并发性的问题。

老师解答:
同学你好,问一下同学的数据库隔离级别是什么?如果是读未提交,会出现脏读,幻读,重复读等。A事务读取到B事务未提交的数据,就属于脏读现象。通常我们可以设置事务的隔离级别来避免并发问题的产生。

后续疑问:

我的数据库事物隔离级别是mysql的默认隔离级别,可重复读。那么上面的疑问怎么解释呢?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,同学所说的插入之前自增的到 10 是指:如下语句这种是吗?

<selectKey resultType= "Integer" keyProperty=" goodsld" order= "Before">

同学的疑问是不是,

我的是默认的可重复读,为什么B读到了A未提交的数据自增的id值,并在上边上边自动增加了1 ,是这个意思吗?

mysql现在的默认引擎InnoDB(5.1版本之后)

它是默认的是行锁,也就是在插入一条数据的时候,这个行是进行锁住的,所以它并不会进行发生自增id是一样的情况。A事务所在的行被锁住后,则B事务在下一行进行插入的,所以它的id是在A事务所在行加1了。这里并不是脏读。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 慕斯2296656 提问者 #1
    是你说的那种情况。如果B事物提交了,A事物回滚了。那么数据表中间是不是就会出现主键id不连续的情况呢?
    2019-11-20 22:24:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师