概述
MySQL同一事务中先更新在查询,结果与数据库中不一致问题
问题背景:
java 代码在同一个事务中先执行update 再执行select 发现select 的数据是update之后的结果,此时事务还没有提交,直接查询数据库,数据库的数据还没有发生变更.
问题结论:
在数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,这是一种机制,用以维护数据库的完整性。在你这个事务单元中存在两个操作,一个是update,一个是select;你前面的update执行成功了,再执行select肯定能够查询到前面update的数据,因为你是在一个单元中。但是另外一个事务(即另一个单元)则不能select到这个update的数据,因为你update的数据还没提交,只在该单元中有效;
注意:此处要与脏读区分开,脏读所指的读到了未提交的数据(这是两个事务操作,而本文的问题前提是在同一个事务中)。也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被称为脏读。
问题验证:
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation
|
+-----------------+
| REPEATABLE-READ |
--可重复读
+-----------------+
1 row in set
mysql> select * from shop_item_stock where id=145106957739827200;
-- 先查询数据此时shop=11111
+--------------------+-------+---------------+------------+----------+---------------------+---------------------+
| id
| shop
| productsaleid | type
| stock
| createtime
| ts
|
+--------------------+-------+---------------+------------+----------+---------------------+---------------------+
| 145106957739827200 | 11111 |
1201152020 | SHOP_STOCK | 84964984 | 2017-12-06 10:03:14 | 2019-09-20 10:43:01 |
+--------------------+-------+---------------+------------+----------+---------------------+---------------------+
1 row in set
mysql> begin; -- 开启事务
Query OK, 0 rows affected
mysql> update shop_item_stock set shop = 110 where id=145106957739827200; -- 更新shop为110
Query OK, 1 row affected
mysql> select * from shop_item_stock where id=145106957739827200;
--事务未提交查询 发现shop正是刚修改的110
若此时你新开一个事务查询会发现shop还是11111
+--------------------+------+---------------+------------+----------+---------------------+---------------------+
| id
| shop | productsaleid | type
| stock
| createtime
| ts
|
+--------------------+------+---------------+------------+----------+---------------------+---------------------+
| 145106957739827200 |
110 |
1201152020 | SHOP_STOCK | 84964984 | 2017-12-06 10:03:14 | 2019-10-18 09:57:04 |
+--------------------+------+---------------+------------+----------+---------------------+---------------------+
1 row in set
mysql> commit; --提交事务
Query OK, 0 rows affected
mysql> select * from shop_item_stock where id=145106957739827200; --查询结果是110
+--------------------+------+---------------+------------+----------+---------------------+---------------------+
| id
| shop | productsaleid | type
| stock
| createtime
| ts
|
+--------------------+------+---------------+------------+----------+---------------------+---------------------+
| 145106957739827200 |
110 |
1201152020 | SHOP_STOCK | 84964984 | 2017-12-06 10:03:14 | 2019-10-18 09:57:04 |
+--------------------+------+---------------+------------+----------+---------------------+---------------------+
1 row in set
mysql> --若此时新开一个事务再查询shop也是110
即同一事务中操作的数据在可见在不同事务中不可见
最后
以上就是精明流沙为你收集整理的MySQL同一事务中先更新在查询,结果与数据库中不一致问题的全部内容,希望文章能够帮你解决MySQL同一事务中先更新在查询,结果与数据库中不一致问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复