===================================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分布式应用开发中,多线程环境下的并发同步是至关重要的一个环节。并发同步器在多线程编程中起到协调各个线程访问共享资源,确保数据一致性与程序正确性的关键作用。本篇笔记将深入探讨Java中的并发同步机制,...
在IT行业中,多线程并发同步是一个重要的概念,特别是在开发高效、响应迅速的应用程序时。这个主题通过一个生动的“爸爸妈妈苹果橘子问题”来解释,这是一个经典的多线程同步问题,有助于理解线程间如何协作共享资源...
标题和描述中提到的核心知识点是“经过正式验证的序列化程序,适用于Lustre-like并发同步数据流程序”。这里的关键词包括“正式验证”、“序列化程序”、“Lustre-like”和“并发同步数据流程序”。 首先,需要了解...
### 进程并发与同步知识点解析 #### 实验目的概览 - **加深对进程概念的理解**:进程作为操作系统中最基本的单位之一,是程序在一个数据集合上的动态执行过程。理解进程的概念及其生命周期对于深入研究操作系统至关...
此外,Canal 还提供了一些高级功能,如支持数据过滤、数据转换和并发同步等。 使用 Canal 可以大大简化数据库同步的流程,并提高数据的一致性和可靠性。它适用于需要实时同步数据的各种场景,如数据仓库、日志分析...
本资源是项目组内分享的PPt,包含并发编程的简述,并发同步的4个工具的介绍,以及并发框架-Fork/Join的介绍
在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现方式。Java作为一种广泛应用于分布式系统开发的编程语言,其内部...
在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...
本文作者通过具体实现了一个并发同步框架的例子来展示了如何利用Java多线程机制解决实际问题。该框架充分利用了Java的多线程机制,如`synchronized`关键字、`volatile`变量等来保证数据一致性,并通过合理的锁设计和...
Java并发编程之同步器代码示例 Java并发编程中,同步器是一种使线程能够等待另一个线程的对象,允许它们协调动作。常用的同步器有CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等。...
综上所述,吕瀛、刘杰、马志柔和叶丹的研究深入探讨了云存储服务中的文件同步问题,提出了一种针对共享场景的增量同步算法,有效地解决了大数据量传输和高并发同步的挑战,为云存储服务的性能优化提供了有价值的解决...
本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决生产者—消费者问题。 运行环境:Microsoft Visual Studio ...
操作系统课程设计——“吃水果问题”是一个典型的进程同步问题,它涉及到并发执行、资源限制以及同步机制的应用。在这个模型中,我们有四个角色:爸爸、妈妈、儿子和女儿,他们各自有不同的任务,需要通过同步来协调...
该系统名为HTD2Sync,它以文件的哈希值为基础,用于并发同步冲突的检测。通过这种方式,系统能够有效地过滤掉大量非实际冲突,提高了同步的效率。在处理目录副本同步时,HTD2Sync考虑了两种主要的冲突类型:文件内容...
c++11并发介绍,详细描述了现代C++的线程,锁,并发同步,无锁队列,已经部分C++11的特性介绍。
在并发Java程序中,同步操作是一项关键且必要的机制,用于保证多线程环境下的数据一致性和安全性。然而,同步操作的频繁使用会带来显著的性能开销,这主要是因为线程之间的上下文切换、锁的竞争以及相关的系统调用...
本文将深入探讨“进程互斥”、“并发”、“同步”和“死锁”这四个核心概念,以及与之相关的进程状态转换和调度策略。 首先,我们来看“进程互斥”。在多进程环境下,为了保证数据的一致性和完整性,有时需要让多个...
### 并发程序的同步和互斥实验知识点详解 #### 一、并发程序的基本概念 在探讨并发程序的同步和互斥之前,我们先来了解一些基本概念。 **并发**是指多个任务在同一时间段内同时执行的过程。而在多核处理器时代,...