码迷,mamicode.com
首页 > 其他好文 > 详细

后端开发学习笔记--事务隔离

时间:2016-11-21 08:46:56      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:并发   事务隔离   通过   upd   更新   返回   编程实践   业务   mysq   

首先,作为一个程序员,需要思考的问题是,我们为什么需要事务

事务是多线程操作数据库下,为了解决数据一致性问题由数据库提供的一种手段,映射到多线程实际编程实践中,事务解决的问题就是多线程需要解决的数据竞争

而事务主要强调的是数据前后一致性,而不是多线程并发

 

从一个简单错误例子来讲,

 

在高并发秒杀业务的场景下,通过

select number from product where product_name = ‘iphone7‘

然后通过服务端应用程序来判断上面的记录是否 > 0 之后

update product number = number -1 where product_name = ‘iphone7‘

 

上面的程序是完全不靠谱的,商品的数量是不能为负数的

第一默认MYSQL的事务隔离级别是 repeatable read 也就是在事务开启的情况下,事务开启的情况下 所读取到的值并非是最新的值,例如本例中的select语句

在事务未提交之前,本线程针对数据库的查询总是会返回相同的值,所以在这个时候需要给 select加锁

select number from product where product_name = ‘iphone7‘ for update 

这样就锁定了 number的值,然后通过

update来完成业务逻辑的数据更新(Mysql针对Update实现了行级锁,所以不必为update 加锁)

 

这样就解决了数据竞争,当然这里有一些问题需要处理,在现实的开发场景里面,

我们还需要在service层抛出运行时异常,例如(商品数量为0,不能继续秒杀,而且还要回滚本次业务请求操作中的一切数据修改),剩下的事情就通过Spring的声明式事务管理来rollback了

后端开发学习笔记--事务隔离

标签:并发   事务隔离   通过   upd   更新   返回   编程实践   业务   mysq   

原文地址:http://www.cnblogs.com/winters1992/p/6084179.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!