1. 程式人生 > >thinkphp如何防止使用者同時操作一張表, sleep(1);

thinkphp如何防止使用者同時操作一張表, sleep(1);

1、資料庫型別要是InnoDB; 

2、加鎖必須跟事務同時使用; 

3、查詢的時候都必須帶鎖,比如:$total = M('dangan')->lock(true)->where($map)->count();這個地方用鎖查詢,其次地方如果查詢這個user物件需要防止同時操作的話也要進行加鎖,就是也要用lock(true)這種方式查詢:  

程式碼示例如下:

        M()->startTrans();//開啟事務
        $map['userid']='test';//查詢條件
        $user = M('User')->lock(true)->where($map)->find();//加鎖查詢
        if($user)
        {
            //執行你想進行的操作, 最後返回操作結果 result
            $result = true;
            if(!$result)
            {
                M()->rollback();//回滾
                $this->error('錯誤提示');
            }
        }
        M()->commit();//事務提交
        $this->success('成功提示');

加上lock(true)的實際就是在查詢語句最後加上 for update,可以用如下這種方法測試,開兩個視窗,一個視窗開啟事務,然後查詢加鎖一條資料,另一個視窗再次查詢加鎖這條資料,你會發現另一個視窗的查詢會一直等待,直到第一個視窗的事務提交

相關推薦

thinkphp如何防止使用者同時操作 sleep(1);

1、資料庫型別要是InnoDB;  2、加鎖必須跟事務同時使用;  3、查詢的時候都必須帶鎖,比如:$total = M('dangan')->lock(true)->where($map)->count();這個地方用鎖查詢,其次地方如果查詢這個user

Java鏈接HBASE數據庫創建一個刪除修改輸出插入修改數據刪除數據獲取顯示信息過濾查詢分頁查詢地理hash

can charat nfa true 目錄結構 dfa byte sin extra 準備工作 1、創建Java的Maven項目 創建好的目錄結構如下: 另外註意junit的版本,最好不要太高,最開始筆者使用的junit4.12的,發現運行的時候會報錯。最後把Junit

Quartz的簡化(只要動態啟停任務)

專案中有模組依賴到了Quartz來做定時任務。那天和大師研究了一下午,講一個使用這個工具的一些收穫。 首先,用的不是原先的Quartz,而是與spring整合的。需要用到Spring-Conte-Support-4.2.3.Release.jar,Quartz-2.2.2.

mysql將一個中資料插入另排重刪除匯入

將一個表中資料插入另一張表的語句: insert into 目標表(欄位1,欄位2,欄位3……) select  欄位1,欄位2,欄位3… from 來源表 where 條件1 and 條件2; 排重很簡單,只要在需要排重的欄位前加distinct就可以嘞!eg~ 查詢記錄

mysql的update可以同時更新多多條記錄

update employee e,test t set e.salary=555,t.name=’tts’ where e.id=3 and t.id=1 UPDATE books,(SELECT bookId,COUNT(id) num FROM libr

Oracle資料庫中知道查詢與其有主外來鍵關係的

--查外來鍵表NC56.CSCI有無對應的主鍵表 SELECT a.owner, A.TABLE_NAME pr

Java連線HBASE資料庫建立一個刪除修改輸出插入修改資料刪除資料獲取顯示錶資訊過濾查詢分頁查詢地理hash

準備工作 1、建立Java的Maven專案 建立好的目錄結構如下: 另外注意junit的版本,最好不要太高,最開始筆者使用的junit4.12的,發現執行的時候會報錯。最後把Junit的版本改成4.7的之後,問題解決了。 編寫POM檔案 <

mysql資料庫的簡單增刪改查合併欄位拼接字元操作用java完成將中的查詢結果合併存入另的指定欄位

首先問題描述:我現在有兩個表,一個表是關鍵詞,一個表是含有關鍵詞的標籤,需要做的就是在關鍵詞表中新建一個標籤欄位,把包含該關鍵詞的全部標籤存入其中。比如關鍵詞是Java,標籤可能有Java開發,Java後臺等。我這裡關鍵詞有4000個,標籤有40000個,我用了小段java程式碼+sql的函式就完成

mong db 批量匯出和匯入json檔案的實際操作記錄匯出和匯入

需求是這樣的:需要修改資料庫中某個表的所有資料,所以,要全部匯出,然後修改,修改完之後,再把修改後的資料給再匯入到mongo去。 具體如下: 備份,匯出一張表為json檔案 具體命令: mo

java 連帶操作(兩關聯插入條新資料另外也跟著插入條新資料)

以角色許可權模組中增加功能為例子:a) 概念: 連帶操作:首先先在Role表中插入一條資料,接著拿到rid,往Role-Acl表中插入一條資料b)資料庫設計:Role表:Role-Acl表:c) 程式碼實現:RoleMap:/**  *  * @Description: 新增

ORACLE中觸發器實現刪除中資料同時刪除另中相關資料

這是我的第一篇部落格。 有兩張表:BOOK、PGEVIEW,分別有一個名為BOOKID的欄位 想實現的功能:刪除BOOK表中的一行資料時刪除與PAGEVIEW表中BOOKID相等的資料行 實現方法:在BOOK表中建立一個觸發器BOOK_TRG_DELETE,具體實現語句如下

C#中Merge方法實現把不同結構的合併成,同時合併資料

以前做評教系統時記得想把2張表結構不同的表合成一張表,當時沒找到使用程式碼如何實現,最後採用了建立檢視的方式方法實現.今天解決某個問題時突然看到了Merge方法可以不建立檢視就解決我當時的問題,記錄下來: 使用Merge方法把2張擁有不同機構的表合成一張表. 有這樣2

資料庫_基礎知識_SQL中遍歷的每條記錄並對每條記錄執行相應操作種方法

sql中遍歷一張表的每條記錄的一種方法: 前提條件:表中存在一個遞增的欄位 如 create table Linkman   {   ID int incremental,   Name nvarchar(50),   .....   }   這樣遍歷這張

sql server觸發器實現插入時操作

以前都是也得mysql,現在寫sqlserver的觸發器,感覺改動還是蠻大的 1.定義變數 #在mysql中變數直接這麼定義就可以了 SET @VALUE = "111"; #在sql server中 declare @count int; #並賦值 set @count

多個字段是另的主鍵關聯查詢語句

left join phone where table 查詢語句 tab tin 主鍵 let CREATE TABLE `User`(   `Id` BIGINT AUTO_INCREMENT NOT NULL,   `Name` VARCHAR(10)

PostgreSQL導出到MySQL

records exe text tor ffi dir force source integer 1. 查看PostgreSQL表結構,數據量,是否有特殊字段值 region_il=# select count(*) from result_basic; count

mysql查有哪些索引

col part ble tab comm 索引 pack comment key 可以用這個命令: show index from table_name; 得到輸出: +------------------+------------+------------+----

SQLSERVER 數據從那個復制到另

int select ffffff 復制 ack pan 條件 back 表復制 insert into 表名1 ( 字段A ,字段B ,字段C) SELECT 字段A ,字段B ,字段C FROM 表名2 (where條件看情況而定)SQ

工作同時刪除2中記錄

log inf 記錄 ext mage alt bsp 技術 作用 mysql: delete a.*,b.* from sys_z_info a,sys_o_info b where a.z_id=b.d_id and a.z_id=‘123456‘ 這個呢在只有1張表

使用sql語句復制

表名 復制 相等 lec 結構 into create int 張新 如何使用sql語句復制一張表? 第一步:先建一張新表,新表的結構與老表相等。 create table newbiao like chengjibiao(老表名); 第二步:將老表中的值復制到新標中。 i