===================================1 同步方案一的方法是同步
php同步执行挺麻烦,根据mysql的文档,可以这样。
GET_LOCK(str,timeout)
设法使用字符串str 给定的名字得到一个锁, 超时为timeout 秒。若成功得到锁,则返回 1,若操作超时则返回0 (例如,由于另一个客户端已提前封锁了这个名字 ),若发生错误
则返回NULL (诸如缺乏记忆或线程mysqladmin kill 被断开 )。假如你有一个用GET_LOCK()得到的锁,当你执行RELEASE_LOCK()或你的连接断开(正常或非正常)时,这个锁就会解
除。
这个函数可用于执行应用程序锁或模拟记录锁定。名称被锁定在服务器范围内。假如一个名字已经被一个客户端封锁, GET_LOCK() 会封锁来自另一个客户端申请封锁同一个名字
的任何请求。这使对一个封锁名达成协议的客户端使用这个名字合作执行建议锁。然而要知道它也允许不在一组合作客户端中的一个客户端封锁名字,不论是服役的还是非故意的
,这样阻止任何合作中的客户端封锁这个名字。一个减少这种情况发生的办法就是使用数据库特定的或应用程序特定的封锁名。例如, 使用db_name.str或 app_name.str 形式的
封锁名。
假如某个文件不希望被用户并发访问,只能依次访问,
假如a.php这个文件,不希望在同一时刻被两个请求访问,可以:
Java代码 收藏代码
$db = getdb();// 获得数据库连接。
//这句话的意思是:第一个执行的程序立刻得到,而第二个执行的程序需要等到前一个也是对持文件的请求
//执行到release_lock的时候,才能获得结果,中间就一直阻塞着。但只阻塞10秒,不管有没有得到锁。
$result = $db->fetchOne("select get_locak('aa', 10)");//
if (intval($result) == 0) { //这句话意思是:为了不让用户等太时间,10秒到了还没得到锁,给用户提示
echo "当前服务器忙,请重新再试";
exit;
}
//执行到这里是得到锁了,于是做一些操作,下面的这些语句不希望被并发。
语句1;
语句2;
//这里结束了,释放锁
$db->query("do realease_locak('aa')");//
//下面的语句不重要,所以可以在锁释放后执行,因为希望占用锁的时间尽可能短。
不重要语句1;
不重要语句2;
程序结束。
========================================== 2 for update的方法是用innodb的行锁。
$db = getdb();
$db->query('SET AUTOCOMMIT=0');
$db->query('START TRANSACTION');
$sql = " select id from air_ticket where isactive=1 and batch='today' for update";//查今天的有效飞机票,for update 是重点。
$result = $db->fetchOne($sql); //因为顾客只想买一张票
if ($result) { //还有票
$db->query("update air_ticket set isactive=0 where batch='today' and id=". $result); //发了一张票
}
$db->query('COMMIT');
$db->query('SET AUTOCOMMIT=1');
if ($result) {
echo "您购买的机票id是".$result;
} else {
echo '对不起,机票已卖完';
}
======================================= 小结
如果操作机票表只有很少的几个文件,可以同步
如果操作机票表只有文件很多,同步不过来(因为那样系统太卡了),只能行锁。
如果写操作并发少,行锁,
写操作并发多,行锁会影响别的写操作,那么同步可以。
(针对这一点,如果用行锁,需要适当分表)
需要同步的代码很少,系统能很快执行完,优先同步,同步正确率应该高,理论上是这样。
反之只能行锁。
分享到:
相关推荐
Java分布式应用学习笔记05多线程下的并发同步器
图形化实现:多线程并发同步,缓冲区容量为2,爸爸放苹果,妈妈放橘子,儿子吃苹果,女儿吃橘子。 图形化实现:多线程并发同步,缓冲区容量为2,爸爸放苹果,妈妈放橘子,儿子吃苹果,女儿吃橘子。
java分布式应用学习笔记05多线程下的并发同步器.pdf
实验目的: 1、 加深对进程概念的理解,区分进程并发执行与串行执行。 2、 掌握进程并发执行的原理,理解进程并发执行的特点。 3、 了解fork( )系统调用的返回值,...能利用相应的系统调用实现进程树与进程间的同步。
此外,Canal 还提供了一些高级功能,如支持数据过滤、数据转换和并发同步等。 使用 Canal 可以大大简化数据库同步的流程,并提高数据的一致性和可靠性。它适用于需要实时同步数据的各种场景,如数据仓库、日志分析...
本资源是项目组内分享的PPt,包含并发编程的简述,并发同步的4个工具的介绍,以及并发框架-Fork/Join的介绍
经过正式验证的序列化程序,适用于Lustre-like并发同步数据流程序
springmvc+spring线程池处理http并发请求数据同步控制问题
本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决生产者—消费者问题。 运行环境:Microsoft Visual Studio ...
针对BPEL并发同步引发的数据竞争、流程阻塞等问题,提出了一种BPEL结构演化算法。该算法的基本思想是利用BPEL基于XML编写的事实,使用XML 解析工具对BPEL的结构进行调整,达到规避失败的同步过程,删除冗余link结构...
c++11并发介绍,详细描述了现代C++的线程,锁,并发同步,无锁队列,已经部分C++11的特性介绍。
模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
并发Java程序同步操作的有效删除
进程互斥.并发.死锁同步程序,其中包括进程调度以及各种状态的转换
面试必考之HashMap源码分析与实现 ,微服务架构之Spring Cloud Eureka 场景...锁、分布式锁、无锁实战全局性IDSpringMvc深入理解源码分析 Nosql Redis Jedis常用命令 JAVA并发编程之多线程并发同步业务场景与解决方案
Java并发大神Doug Lee同步队列论文
Python3爬虫系列的理论验证,比较同步依序下载、多进程并发、多线程并发和asyncio异步编程之间的效率差别
针对高可靠性、高质量的Java并行多任务程序设汁,分析了Java多线程机制的原理及其实现技术.研究了程序并发过程中的同步机制和交互通信机制,比较...所构造的一个具有完全意义上的并发同步的框架实例有一定的实用价值。
分布式锁概念当我们在单机环境下进行应用开发,涉及到并发同步时,说到如何保证线程的安全,相信大家一定能想到采用synchronized或者Lock的方式,来解决多线程间的代码同步问题。这时多线程的运行都是在同一个JVM之...