文章标题

来源:互联网 发布:数控自动编程软件 编辑:程序博客网 时间:2024/05/20 04:29

最近写项目的时候出现了一个比较严重的支付接口的问题,两个回调请求同时到了,导致一次钱充了两次的问题。在这个过程中对数据库的事务和锁有了更加深刻的了解。
mvcc
http://blog.csdn.net/chen77716/article/details/6742128
首先多个事务同时存在的情况下,可能有:
脏读:即读未提交
不可重复读:即一个事物中多次查询的结果可能不同
幻读:情景是这样的:比如有两个事务,一个A事务,一个B事务,如果A事务对某个范围的数据全部修改成了1,然后B事务在这个范围中插入了一条数据,此时A再去看这个范围的数据 发现有一条数据没有改成1 就像产生了幻觉一样 这个称之为幻读
这些情况对应事务的隔离等级isolate:
1,读未提交 产生脏读
2,读已提交 产生不可重复读
3,可重复读 产生幻读 读取指定版本 所有一个事务中每次读到的值一样 update中的where取的是已经提交的最新的
4,串行化 没有任何问题 但是事务不并发 导致效率很慢

在可重复读的情况下
开启一个事务A
start transaction;
开启事务B
start transaction;
执行
A:select * from useraccount;
B:select * from useraccount;
执行
A:update useraccount set uname=”chen” where id=’1’
B:update useraccount set uname=”chen” where id=’1’
此时B会阻塞直到A提交
A:commit
直到此时B才会执行
B:commit
mysql默认的隔离级别就是可重复读

0 0
原创粉丝点击