MYSQL数据库模拟队列实现
来源:互联网 发布:网络好名字大全 编辑:程序博客网 时间:2024/05/29 09:15
1、首先MYSQL数据库的默认事务隔离级别为:REPEATABLE-READ 可重复读。
2、如果不是上述隔离级别,请先修改隔离级别为可重复读,修改方法如下:
mysql> set session transaction isolation level REPEATABLE READ;
3、开启两个命令行窗口,分别登录mysql,并命名为session1和session2,以模拟两个消费者消费模拟队列的数据(已提前保存好6条队列数据,不再模拟生产者的行为)。注释:id为自增主键、session用来存储sessionId,msg是待消费的数据体,status是消费状态(un_use:未消费,using:消费中,used:已消费)。
4、分别在SESSION1和SESSION2中开启事务,并查询此时队列中的数据状态,可以看到全部为un_use状态。
mysql> start transaction;
5、现在开始消费,session1先消费,假设每次消费2条。
mysql> update user set session=CONNECTION_ID(),status='using' where status='un_use' limit 2;
6、假如此时session2并发消费消息
情况(1)如果session1还没有commit事务,session2需要等待,一直等到session1提交事务(见情况(2)),或者session2超时回滚或重试。
情况(2)如果session1已经commit事务,则神奇的一幕出现了。
可以看到:session2执行update语句更新数据,更新的是id=1008,1009的两条消息!!!(讲道理应该更新1006,1007,为什么会更新1008和1009呢?除非,session2感知到了1006和1007被session1更新过了,但是从select结果上看,session2并没有感知到1006和1007已变化,这是一个神奇的东西,或许和MVCC有关,请懂的大牛们指教!)
7、既然如此,session1和session2都拿到了自己应该处理的消息,那就可以进行消息处理了,处理完消息以后,通过id来更新数据库状态就不存在并发问题了。
8、通过上面两session交替执行更新,可以进行并发更新,周而复始。
9、如果执行过程中session中断,则会造成一部分using状态的数据变成僵尸数据,此时可以结合定时任务,对using数据进行进行扫描。
- MYSQL数据库模拟队列实现
- PHP+Mysql模拟队列
- 文本数据处理—结合mysql模拟实现消息队列
- 队列的模拟实现
- 模拟实现 队列
- 队列模拟实现
- 模拟实现循环队列
- 模拟实现队列
- 模拟实现队列
- 【C++】模拟实现队列
- 用MySQL模拟消息队列
- 其他数据库模拟实现mysql的limit语法
- 利用优先级队列实现事件驱动模拟
- java模拟阻塞队列的实现
- 【c++】模拟实现顺序队列方法一
- 【c++】模拟实现顺序队列方法二
- java 使用线程模拟 队列实现
- 两个栈模拟实现一个队列
- linux C++服务器
- 熟悉 NumPy 常用函数
- 部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi
- Android常用开源项目(十二)
- 编译原理FIRST集、FOLLOW集、SELECT集求法通俗解释 & LL(1)文法判定
- MYSQL数据库模拟队列实现
- JavaWeb中应该知道的一些概念
- Maven学习笔记(十)-Maven整合SSHSJ(Spring+SpringMVC+Hibernate+Spring Data JPA+JdbcTemplate)框架
- 特殊进程之守护进程
- 计算布林带
- Java compiler level does not match the version of the installed java project facet
- web开发中合计信息的处理
- Java线程通信-管道流
- 云信点击语音按钮就崩溃