今天看了黎活明老师的 实现订单加锁解锁(也包括生成订单号)功能 的视频,即多人操作(审核等)订单时的如何加锁。

对事务并发又温习了一下。涉及的东西无非是操作系统的多线程引起的并发,这里有个概念就是cpu时间片,也就是说在一个cpu时间片上只会有一个指令(一个线程里的)在执行,到下一个时间片就根据线程的调度就会执行其它指令(可能是另一个线程的),对我们来说就是多线程并发。由于时间片很短,所以我们把两个用户同时操作看成是并发的。

另外多线程并发操作数据库时,就又有一个概念,就是数据库隔离级别。

我们的订单加锁就是在数据库隔离级别上的某个级别上做。隔离级别不同可能做法不同。

oracle数据库默认隔离级别,会对update加更新锁,更新完后会加排他锁,事务提交后才会解除排他锁。

黎活明老师巴巴远动视频里还讲了两种生成订单号的方法,其中一种是可以用在分布式环境部署是生成不唯一订单号的方法,建议看看。

订单号:

a4c26d1e5885305701be709a3d33442f.png

主要当t1的事务提交后,t2才能更新。所以t1更新完后,再查询出来的数据一定是他刚更新过得。

当然这要两点保证:

1: update和select在一个事务里。

2:事务的隔离级别,利用数据库事务的锁机制。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐