后端开发学习笔记--事务隔离
Posted winters1992
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后端开发学习笔记--事务隔离相关的知识,希望对你有一定的参考价值。
首先,作为一个程序员,需要思考的问题是,我们为什么需要事务
事务是多线程操作数据库下,为了解决数据一致性问题由数据库提供的一种手段,映射到多线程实际编程实践中,事务解决的问题就是多线程需要解决的数据竞争
而事务主要强调的是数据前后一致性,而不是多线程并发
从一个简单错误例子来讲,
在高并发秒杀业务的场景下,通过
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了
以上是关于后端开发学习笔记--事务隔离的主要内容,如果未能解决你的问题,请参考以下文章