事物隔离级别
问题: 老师 我有一个疑问: 两个不同的事物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的默认隔离级别,可重复读。那么上面的疑问怎么解释呢?
11
收起
正在回答
1回答
同学你好,同学所说的插入之前自增的到 10 是指:如下语句这种是吗?
<selectKey resultType= "Integer" keyProperty=" goodsld" order= "Before">
同学的疑问是不是,
我的是默认的可重复读,为什么B读到了A未提交的数据自增的id值,并在上边上边自动增加了1 ,是这个意思吗?
mysql现在的默认引擎InnoDB(5.1版本之后)
它是默认的是行锁,也就是在插入一条数据的时候,这个行是进行锁住的,所以它并不会进行发生自增id是一样的情况。A事务所在的行被锁住后,则B事务在下一行进行插入的,所以它的id是在A事务所在行加1了。这里并不是脏读。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
3. Java 数据库开发与实战应用
- 参与学习 人
- 提交作业 357 份
- 解答问题 8016 个
本阶段将带你学习MySQL数据库,JDBC接口,MyBatis框架等,带你掌握的数据的存放和管理。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星