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

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了

以上是关于后端开发学习笔记--事务隔离的主要内容,如果未能解决你的问题,请参考以下文章

SpringJdbc学习笔记-04事务的传播和隔离

SpringJdbc学习笔记-04事务的传播和隔离

DB | MySQL核心知识学习之路

JDBC学习笔记——事务的隔离级别&批量处理

spring学习笔记声明式事务

JavaEE——事务隔离和锁