一掸掏、基礎規(guī)范
(1)必須使用InnoDB存儲引擎
解讀:支持事務、行級鎖岭佳、并發(fā)性能更好歪今、CPU及內(nèi)存緩存頁優(yōu)化使得資源利用率更高
(2)新庫默認使用utf8mb4字符集
解讀:utf8mb4是utf8的超集,emoji表情以及部分不常見漢字在utf8下會表現(xiàn)為亂碼践美,故需要升級至utf8mb4洗贰。標準,萬國碼陨倡,無需轉(zhuǎn)碼敛滋,無亂碼風險
阿里云上RDS服務如果要從utf8升級為utf8mb4,需要重啟實例
(3)數(shù)據(jù)表兴革、數(shù)據(jù)字段必須加入中文注釋
解讀:N年后誰tm知道這個r1,r2,r3字段是干嘛的
(4)禁止使用存儲過程绎晃、視圖蜜唾、觸發(fā)器、Event
解讀:高并發(fā)大數(shù)據(jù)的互聯(lián)網(wǎng)業(yè)務庶艾,架構(gòu)設計思路是“解放數(shù)據(jù)庫CPU袁余,將計算轉(zhuǎn)移到服務層”,并發(fā)量大的情況下咱揍,這些功能很可能將數(shù)據(jù)庫拖死颖榜,業(yè)務邏輯放到服務層具備更好的擴展性,能夠輕易實現(xiàn)“增機器就加性能”煤裙。數(shù)據(jù)庫擅長存儲與索引掩完,CPU計算還是上移吧
(5)禁止存儲大文件或者大照片
解讀:為何要讓數(shù)據(jù)庫做它不擅長的事情?大文件和照片存儲在文件系統(tǒng)硼砰,數(shù)據(jù)庫里存URI多好
二且蓬、命名規(guī)范
(6)只允許使用內(nèi)網(wǎng)域名,而不是ip連接數(shù)據(jù)庫
(7)線上環(huán)境夺刑、開發(fā)環(huán)境缅疟、測試環(huán)境數(shù)據(jù)庫內(nèi)網(wǎng)域名遵循命名規(guī)范
(8)庫名分别、表名遍愿、字段名:小寫,下劃線風格耘斩,不超過32個字符沼填,必須見名知意,禁止拼音英文混用
(9)表名t_xxx括授,非唯一索引名idx_xxx坞笙,唯一索引名uniq_xxx
三、表設計規(guī)范
(10)單實例表數(shù)目必須小于500
(11)單表列數(shù)目必須小于30
(12)表必須有主鍵荚虚,例如自增主鍵
解讀:
a)主鍵遞增薛夜,數(shù)據(jù)行寫入可以提高插入性能,可以避免page分裂版述,減少表碎片提升空間和內(nèi)存的使用
b)主鍵要選擇較短的數(shù)據(jù)類型梯澜, Innodb引擎普通索引都會保存主鍵的值,較短的數(shù)據(jù)類型可以有效的減少索引的磁盤空間渴析,提高索引的緩存效率
c) 無主鍵的表刪除晚伙,在row模式的主從架構(gòu),會導致備庫夯住
(13)禁止使用外鍵俭茧,如果有外鍵完整性約束咆疗,需要應用程序控制
解讀:外鍵會導致表與表之間耦合,update與delete操作都會涉及相關(guān)聯(lián)的表母债,十分影響sql 的性能午磁,甚至會造成死鎖尝抖。高并發(fā)情況下容易造成數(shù)據(jù)庫性能,大數(shù)據(jù)高并發(fā)業(yè)務場景數(shù)據(jù)庫使用以性能優(yōu)先
四迅皇、字段設計規(guī)范
(14)必須把字段定義為NOT NULL并且提供默認值
解讀:
a)null的列使索引/索引統(tǒng)計/值比較都更加復雜牵署,對MySQL來說更難優(yōu)化
b)null 這種類型MySQL內(nèi)部需要進行特殊處理,增加數(shù)據(jù)庫處理記錄的復雜性喧半;同等條件下奴迅,表中有較多空字段的時候,數(shù)據(jù)庫的處理性能會降低很多
c)null值需要更多的存儲空挺据,無論是表還是索引中每行中的null的列都需要額外的空間來標識
d)對null 的處理時候取具,只能采用is null或is not null,而不能采用=扁耐、in暇检、<、<>婉称、!=块仆、not in這些操作符號。如:where name!=’shenjian’王暗,如果存在name為null值的記錄悔据,查詢結(jié)果就不會包含name為null值的記錄
(15)禁止使用TEXT、BLOB類型
解讀:會浪費更多的磁盤和內(nèi)存空間俗壹,非必要的大量的大字段查詢會淘汰掉熱數(shù)據(jù)科汗,導致內(nèi)存命中率急劇降低,影響數(shù)據(jù)庫性能
(16)禁止使用小數(shù)存儲貨幣
解讀:使用整數(shù)吧绷雏,小數(shù)容易導致錢對不上
解決方案:使用“分”作為單位头滔,這樣數(shù)據(jù)庫里就是整數(shù)了。
(17)必須使用varchar(20)存儲手機號
解讀:
a)涉及到區(qū)號或者國家代號涎显,可能出現(xiàn)+-()
b)手機號會去做數(shù)學運算么坤检?
c)varchar可以支持模糊查詢,例如:like“138%”
(18)禁止使用ENUM期吓,可使用TINYINT代替
解讀:
a)增加新的ENUM值要做DDL操作
b)ENUM的內(nèi)部實際存儲就是整數(shù)早歇,你以為自己定義的是字符串?
五膘婶、索引設計規(guī)范
(19)單表索引建議控制在5個以內(nèi)
(20)單索引字段數(shù)不允許超過5個
解讀:字段超過5個時缺前,實際已經(jīng)起不到有效過濾數(shù)據(jù)的作用了
(21)禁止在更新十分頻繁、區(qū)分度不高的屬性上建立索引
解讀:
a)更新會變更B+樹悬襟,更新頻繁的字段建立索引會大大降低數(shù)據(jù)庫性能
b)“性別”這種區(qū)分度不大的屬性衅码,建立索引是沒有什么意義的,不能有效過濾數(shù)據(jù)脊岳,性能與全表掃描類似
(22)建立組合索引逝段,必須把區(qū)分度高的字段放在前面
解讀:能夠更加有效的過濾數(shù)據(jù)
六垛玻、SQL使用規(guī)范
(23)禁止使用SELECT *,只獲取必要的字段奶躯,需要顯示說明列屬性
解讀:
a)讀取不需要的列會增加CPU帚桩、IO、NET消耗
b)不能有效的利用覆蓋索引
c)使用SELECT *容易在增加或者刪除字段后出現(xiàn)程序BUG
(24)禁止使用INSERT INTO t_xxx VALUES(xxx)嘹黔,必須顯示指定插入的列屬性
解讀:容易在增加或者刪除字段后出現(xiàn)程序BUG
(25)禁止使用屬性隱式轉(zhuǎn)換
解讀:SELECT uid FROM t_user WHERE phone=13812345678 會導致全表掃描账嚎,而不能命中phone索引,猜猜為什么儡蔓?(這個線上問題不止出現(xiàn)過一次)
(26)禁止在WHERE條件的屬性上使用函數(shù)或者表達式
解讀:SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15' 會導致全表掃描
正確的寫法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00')
(27)禁止負向查詢郭蕉,以及%開頭的模糊查詢
解讀:
a)負向查詢條件:NOT、!=喂江、<>召锈、!<、!>获询、NOT IN涨岁、NOT LIKE等,會導致全表掃描
b)%開頭的模糊查詢吉嚣,會導致全表掃描
(28)禁止大表使用JOIN查詢梢薪,禁止大表使用子查詢
解讀:會產(chǎn)生臨時表,消耗較多內(nèi)存與CPU瓦戚,極大影響數(shù)據(jù)庫性能
(29)禁止使用OR條件沮尿,必須改為IN查詢
解讀:舊版本Mysql的OR查詢是不能命中索引的丛塌,即使能命中索引较解,為何要讓數(shù)據(jù)庫耗費更多的CPU幫助實施查詢優(yōu)化呢?
(30)應用程序必須捕獲SQL異常赴邻,并有相應處理
行為規(guī)范:
(31)禁止使用應用程序配置文件內(nèi)的帳號手工訪問線上數(shù)據(jù)庫
(32)禁止非DBA對線上數(shù)據(jù)庫進行寫操作印衔,修改線上數(shù)據(jù)需要提交工單,由DBA執(zhí)行姥敛,提交的SQL語句必須經(jīng)過測試
(33)分配非DBA以只讀帳號奸焙,必須通過VPN+跳板機訪問授權(quán)的從庫
(34)開發(fā)、測試彤敛、線上環(huán)境隔離
Java編碼規(guī)范 是否滿足命名規(guī)約 包名
類名和接口名
方法名
變量名
常量名
編碼格式是否良好 每行代碼寬度為120個字符
使用Ctrl+Shift+F進行格式化
注釋是否完整清晰 注釋是否完整
意義是否明確
語法是否正確
是否存在多余的代碼 是否有被注釋掉的方法和變量等
是否有未使用的方法和變量等
是否有重復的代碼
是否存在不必要的Import語句
提示信息是否正確 意義是否明確
語法是否正確
是否做國際化處理(如果要求)
數(shù)組聲明是否正確与帆,如:使用int[] packets,而非int packets[]
相對獨立的程序塊與塊之間是否有空行
是否盡量避免使用deprecated方法
需要換行的話墨榄,盡量用 println 來代替在字符串中使用"\n"玄糟。
是否用pathSeptarator()方法代替路徑中的“:”或“;”
是否用separator()方法代替路徑中的“/”或“\”
If,While,for語句塊為單行時袄秩,是否使用{}
是否存在魔法數(shù)字(應根據(jù)其意義阵翎,定義成常量)
連接多個字符串時逢并,是否使用StringBuffer對象,而不是String
是否存在空的Catch語句
在保證代碼規(guī)范的基礎上郭卫,請對程序邏輯和性能等方面進行檢查砍聊,可以協(xié)助使用以下工具:
1.FindBugs,PMD檢查程序潛在的缺陷
2.cobertura檢查單體測試覆蓋率
方法相關(guān) 方法的參數(shù)是否做了適當校驗
數(shù)組類結(jié)構(gòu)是否做了邊界校驗
變量在使用前是否做了初始化
是否存在體積過于龐大的方法
對命令行執(zhí)行的代碼贰军,需要詳細檢查命令行參數(shù)玻蝌,如果不滿足,需打印Usage
方法API是否被良好定義词疼,即是否盡量面向接口編程灶伊,便于維護和重構(gòu)
對于循環(huán)語句 循環(huán)結(jié)束條件是否準確
是否避免了死循環(huán)的產(chǎn)生
不要在循環(huán)中構(gòu)造和釋放對象
Java對象處理 對象生命周期的處理,是否對象的reference已經(jīng)失效,能夠設置為null,并被回收
在對象的傳值和傳參方面有無問題,對象的clone方法使用是否過度
是否大量經(jīng)常的創(chuàng)建臨時對象
是否盡量使用局部對象(堆棧對象)
在只需要對象reference的地方是否創(chuàng)建了新的對象實例
數(shù)據(jù)庫方面 數(shù)據(jù)庫設計或SQL語句是否便于移植(注意和性能方面會存在沖突)
數(shù)據(jù)庫資源是否正常關(guān)閉和釋放
數(shù)據(jù)庫訪問模塊是否正確封裝,便于管理和提高性能
是否采用合適的事務隔離級別
是否采用PreparedStatement以提高性能
異常處理方面 每次當方法返回時是否正確處理了異常寒跳,如最簡單的處理聘萨,記錄日志到日志文件中
是否對數(shù)據(jù)的值和范圍進行合法性校驗,包括采用斷言(assertion)
在出錯路徑上是否所有的資源和內(nèi)存都已經(jīng)釋放
所有拋出的異常都得到正確的處理童太,特別是對子方法拋出的異常米辐,在整個調(diào)用棧中必須能夠被捕捉并處理
當調(diào)用導致錯誤發(fā)生時,方法的調(diào)用者應該得到一個通知
是否對錯誤處理部分的代碼進行測試书释,很多代碼在正常情況下執(zhí)行良好翘贮,而一旦出錯,整個系統(tǒng)就崩潰
面向?qū)ο蠓矫? 類設計和抽象是否合適
是否符合面向接口編程的思想
是否采用合適的設計范式
性能方面 在海量數(shù)據(jù)出現(xiàn)時,隊列,表,文件,在傳輸,upload等方面是否會出現(xiàn)問題,有無控制,如分配的內(nèi)存塊大小,隊列長度等控制參數(shù)
對hashtable,vector等集合類數(shù)據(jù)結(jié)構(gòu)的選擇和設置是否合適爆惧,如正確設置capacity,load factor等參數(shù)狸页,數(shù)據(jù)結(jié)構(gòu)是否是同步的
有無濫用String對象的現(xiàn)象,在處理 String 的時候要盡量使用 StringBuffer 類扯再;在StringBuffer的構(gòu)造函數(shù)里設定它的初始化容量芍耘,這樣可以明顯地提升性能
是否采用通用的線程池、對象池模塊等cache技術(shù)以提高性能
類的接口是否定義良好熄阻,如參數(shù)類型等斋竞,避免內(nèi)部轉(zhuǎn)換
是否采用內(nèi)存或硬盤緩沖機制以提高效率
并發(fā)訪問時的應對策略
I/O方面是否使用了合適的類或采用良好的方法以提高性能(如減少序列化,使用buffer類封裝流等)
同步方法的使用是否得當,是否過度使用秃殉,避免太多的使用 synchronized 關(guān)鍵字
遞歸方法中的疊代次數(shù)是否合適坝初,應該保證在合理的棧空間范圍內(nèi)
如果調(diào)用了阻塞方法钾军,是否考慮了保證性能的措施
錯誤發(fā)生時是否所有的對象被釋放鳄袍,如數(shù)據(jù)庫連接、Socket吏恭、文件等
線程相關(guān) 需要被多個線程訪問的對象是否線程安全拗小,檢查有無通過同步方法保護
同步對象上的鎖是否按相同的順序獲得和釋放以避免死鎖,注意錯誤處理代碼
是否存在可能的死鎖或是競爭砸泛,當用到多個鎖時十籍,避免出現(xiàn)類似情況:線程A獲得鎖1蛆封,然后鎖2,線程B獲得鎖2勾栗,然后鎖1
在保證線程安全的同時惨篱,要注意避免過度使用同步,導致性能降低
單體測試相關(guān) 是否每個公共接口方法都有對應的單體測試程序
是否針對多種條件值進行測試
是否對異常系進行測試
其他 日志是否正常輸出和控制
配置信息如何獲得,是否有硬編碼
概述: 主要存放新產(chǎn)品研發(fā)的架構(gòu)部署围俘,架構(gòu)解決方案砸讳,持續(xù)集成,持續(xù)部署和自動化的一些資料等界牡。
###################################################################################
新產(chǎn)品自動化測試方案和計劃 Test Plan
01 梳理新產(chǎn)品自動化的核心業(yè)務模塊和一些數(shù)據(jù)業(yè)務 包括夜審 價格算法 和房量算法
02 使用SQL語句和業(yè)務腦圖 梳理清楚 核心模塊的 業(yè)務流程用例
03 使用Python SQL 開發(fā)和實現(xiàn) 業(yè)務核心的自動化 用例
04
05
使用自動化 用例 集成CI Jenkins 對核心業(yè)務進行驗證
JMeter 核心接口壓力測試 壓測
################################################################################### 日志測試SQL語句##############
use log_dev database, change your table name and timestamp day value, and excute it
select log_cd,func_cd,log_dhms from log_operate_1709 where created_date >= to_timestamp('2017-09-11', 'yyyy-mm-dd')
and log_cd <> '日志類型' order BY created_date DESC;
select log_cd,func_cd,log_dhms,infurl,infnm from log_pdt_data_1709 where created_date >= to_timestamp('2017-09-11', 'yyyy-mm-dd')
and log_cd <> '日志類型' ORDER BY created_date DESC;
--testing log SQL statements
select log_cd,func_cd,log_dhms,from_ip from log_operate_1709 where
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd')
and log_cd <> '日志類型' order BY created_date DESC;
select log_cd,func_cd,log_dhms,infurl,infnm,from_ip from log_pdt_data_1709 where
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd')
and log_cd <> '日志類型' ORDER BY created_date DESC;
--count log_operate_1709 and log_pdt_data_1709 tables current date record
select count(log_cd) from log_operate_1709 where log_cd <> '日志類型' and
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd');
select count(log_cd) from log_pdt_data_1709 where log_cd <> '日志類型' and
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd');
#################################################################################################################
白盒測試 需求用例 名詞解釋 houseblock鎖房 RT+ 只改房含 RT* 不管改不改房含 只要改了房價 noshow 預定未到 結(jié)賬folio 就是結(jié)賬賬單-已結(jié)賬下面 下個+下面的
001.房價=====================================================
每日房價記錄數(shù)與住店時間一致
houseblock記錄數(shù)與住店時間一致
每日收取的房含要出現(xiàn)在每日房含表中的每一天簿寂,首日房含只能出現(xiàn)在首日
一期所有每日房價的價格代碼、折扣一樣
RT+只能有一套房含
RT只能有一套房含宿亡,且每日價格設定一樣
002.預訂=====================================================
沒有來期大于等于今日的noshow賬戶
沒有離期小于今日的在店賬戶
沒有來期小于今日的預訂賬戶
沒有來期大于今日的在店賬戶
每個賬戶至少有一個住店客人常遂,且賬戶表里的住店客人ID對應的存在
每個賬戶只能有一個預訂人,且賬戶表里的預訂人ID對應的存在
003.賬務====================================================
客賬交易金額與賬務明細金額一致挽荠,12個細項金額也一致
賬單的余額為0
已結(jié)賬戶余額為0
結(jié)賬folio里的幾個金額與明細一致
轉(zhuǎn)賬folio里的幾個金額與明細一致
004.客房====================================================
空房態(tài)沒有在店賬戶
占用房態(tài)必有在店賬戶
維修房態(tài)有對應的維修記錄
houseblock
###################################################################
白盒測試 by 20170622
房價 housingprice_test001 housingprice_test002 housingprice_test003
1.每日房價記錄數(shù)與住店時間一致
SELECT country, SUM( CASE WHEN sex = '1' THEN population ELSE 0 END), --男性人口 SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) --女性人口 FROM Table_A GROUP BY country
2.houseblock記錄數(shù)與住店時間一致
select * from emp where empno=7369 for update;
3.每日收取的房含要出現(xiàn)在每日房含表中的每一天克胳,首日房含只能出現(xiàn)在首日
select * from emp where empno=7369 for update;
4.一期所有每日房價的價格代碼、折扣一樣
select * from emp where empno=7369 for update;
5.RT+只能有一套房含
select * from emp where empno=7369 for update;
6.RT只能有一套房含圈匆,且每日價格設定一樣
select * from emp where empno=7369 for update;
7.每日房含12個分項的合計與每日房價的一致
select * from emp where empno=7369 for update;
預訂 reserve_test001 reserve_test002
1.沒有來期大于等于今日的noshow賬戶
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='NSW' AND arr_dt>今日
2.沒有離期小于今日的在店賬戶
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='STY' AND dpt_dt<今日
3.沒有來期小于今日的預訂賬戶
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='RSV' AND arr_dt<今日
4.沒有來期大于今日的在店賬戶
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='STY' AND arr_dt>今日
5.每個賬戶至少有一個住店客人漠另,且賬戶表里的住店客人ID對應的存在
SELECT resv_no,acct_no,acct_stus FROM rsv_account WHERE acct_stus IN ('RSV','STY','WAT') AND resv_no NOT IN ( SELECT DISTINCT(M.resv_no) FROM rsv_account M INNER JOIN rsv_account_guest D ON M.resv_no=D.resv_no AND M.acct_no=D.acct_no WHERE acct_stus IN ('RSV','STY','WAT') AND guest_flg='RE' ORDER BY M.resv_no)
6.每個賬戶只能有一個預訂人,且賬戶表里的預訂人ID對應的存在
(SELECT guest_id FROM rsv_account m INNER JOIN rsv_account_guest d ON m.resv_no=d.resv_no AND m.bkguest_id=d.guest_id WHERE acct_stus IN ('RSV','STY','WAT') AND guest_flg='BK'
ORDER BY m.resv_no,d.acct_no)
SELECT acct_stus,resv_no,acct_no FROM rsv_account WHERE acct_stus IN ('RSV','STY','WAT') AND acct_no IN ( SELECT d.acct_no FROM rsv_account m INNER JOIN rsv_account_guest d ON m.resv_no=d.resv_no AND m.acct_no=d.acct_no WHERE acct_stus IN ('RSV','STY','WAT') AND guest_flg='BK' GROUP BY d.acct_no HAVING COUNT(*)>1)
賬務 financial_test001 financial_test002
1.客賬交易金額與賬務明細金額一致跃赚,12個細項金額也一致
金額一致:
SELECT * from (SELECT mtrn_id,SUM(trntot_amt) as amt1 FROM hpt_fin_transaction GROUP BY mtrn_id) A, (SELECT trn_id,SUM(trn_amt) as amt2 FROM hpt_fin_transaction_jrnl WHERE jrnl_typ='REVN' GROUP BY trn_id) B WHERE A.mtrn_id=B.trn_id AND amt1<>amt2
細項一致:
SELECT * FROM (SELECT mtrn_id,acct_no,room_num,trn_cd,trn_drpt,trntot_amt AS amt1,trn_net+trn_tax1+trn_tax2+trn_tax3+trn_tax4+trn_tax5+trnsvc_net+trnsvc_tax1+trnsvc_tax2+trnsvc_tax3+trnsvc_tax4+trnsvc_tax5 AS amt2 FROM hpt_fin_transaction) A WHERE A.amt1<>A.amt2
2.賬單的余額為0
SELECT acct_no,bill_no,SUM(trntot_amt) from hpt_fin_transaction WHERE COALESCE(bill_no,'')<>'' GROUP BY acct_no,bill_no HAVING SUM(trntot_amt)>0 ORDER BY acct_no
3.已結(jié)賬戶余額為0
SELECT a.acct_no,SUM(trntot_amt) from rsv_account a LEFT JOIN hpt_fin_transaction t ON a.acct_no=t.acct_no WHERE a.acct_stus='OUT' GROUP BY a.acct_no HAVING SUM(trntot_amt)>0
4.結(jié)賬folio里的幾個金額與明細一致
SELECT F.acct_no,F.folio_no,credit_amt,debit_amt,check_amt,T.acct_no,T.bill_no,T.normal,trnamt FROM hpt_fin_folio F LEFT JOIN (SELECT acct_no,bill_no,normal,sum(trntot_amt) AS trnamt FROM hpt_fin_transaction WHERE bill_no<>'' GROUP BY acct_no,bill_no,normal ORDER BY acct_no,bill_no) T ON F.acct_no=T.acct_no AND F.folio_no=T.bill_no WHERE F.folio_typ='BILL' AND COALESCE(credit_amt,0)<>COALESCE(debit_amt,0) OR CASE T.normal WHEN 'C' THEN COALESCE(debit_amt,0)<>trnamt WHEN 'D' THEN COALESCE(credit_amt,0)<>trnamt ELSE 1=1 END
5.轉(zhuǎn)賬folio里的幾個金額與明細一致
SELECT F.acct_no,F.folio_typ,F.folio_no,credit_amt,debit_amt,check_amt,J.trn_amt from hpt_fin_folio F LEFT JOIN (SELECT acct_no,pkgfolio_no,sum(trn_amt) AS trn_amt FROM hpt_fin_transaction_jrnl WHERE jrnl_typ='MOVE' GROUP BY acct_no,pkgfolio_no ORDER BY acct_no,pkgfolio_no) J ON F.acct_no=J.acct_no AND F.folio_no=J.pkgfolio_no WHERE F.folio_typ='MVIN' OR F.folio_typ='MVOUT' AND (COALESCE(credit_amt,0)+COALESCE(debit_amt,0)<>COALESCE(check_amt,0) OR COALESCE(check_amt,0)<>COALESCE(trn_amt,0))
SELECT F.acct_no,F.folio_typ,F.folio_no,credit_amt,debit_amt,check_amt,J.normal,J.trn_amt from hpt_fin_folio F LEFT JOIN (SELECT acct_no,pkgfolio_no,normal,sum(trn_amt) AS trn_amt FROM hpt_fin_transaction_jrnl WHERE jrnl_typ='MOVE' GROUP BY acct_no,pkgfolio_no,normal ORDER BY acct_no,pkgfolio_no,normal) J ON F.acct_no=J.acct_no AND F.folio_no=J.pkgfolio_no WHERE F.folio_typ='MVIN' OR F.folio_typ='MVOUT' AND CASE J.normal WHEN 'C' THEN COALESCE(credit_amt,0)<>J.trn_amt WHEN 'D' THEN COALESCE(debit_amt,0)<>J.trn_amt ELSE 1=1 END
客房 hotelroom_test001 hotelroom_test002
1.空房態(tài)沒有在店賬戶
SELECT arr_dt,dpt_dt,resv_no,acct_no,room_num FROM rsv_account WHERE acct_stus='STY' AND room_num IN (SELECT room_num FROM hpt_hk_room WHERE fo_room_stus='V')
2.占用房態(tài)必有在店賬戶
SELECT arr_dt,dpt_dt,resv_no,acct_no,room_num FROM rsv_account WHERE acct_stus='STY' AND room_num IN (SELECT room_num FROM hpt_hk_room WHERE fo_room_stus<>'O')
3.維修房態(tài)有對應的維修記錄
SELECT room_num FROM hpt_hk_room WHERE room_stus='OOO' AND room_num NOT IN (SELECT room_num FROM hpt_hk_room_repair WHERE repair_typ='OOO' AND start_dt<=當日 AND end_dt>=當日)
PMS Clean SQL Statements
####################delete clean all data################
delete from grp_crm_corp;
delete from grp_crm_corp_address;
delete from grp_crm_corp_blacklist;
delete from grp_crm_corp_contact;
delete from grp_crm_corp_contactway;
delete from grp_crm_corp_contract;
delete from grp_crm_corp_manageunit;
delete from grp_crm_corp_notice;
=====================================================
delete from grp_crm_profile;
delete from grp_crm_profile_address;
delete from grp_crm_profile_blacklist;
delete from grp_crm_profile_certificate;
delete from grp_crm_profile_class;
delete from grp_crm_profile_company;
delete from grp_crm_profile_contactway;
delete from grp_crm_profile_notice;
#############################################################################################################
delete from hpt_fin_folio;
delete from hpt_fin_transaction;
delete from hpt_fin_transaction_jrnl;
delete from rsv_account;
delete from rsv_account_guest;
delete from rsv_account_package;
delete from rsv_account_package_price;
delete from rsv_account_rate;
delete from rsv_account_rate_copy;
delete from rsv_account_roomrequest;
delete from rsv_houseblock;
update hpt_hk_room set room_stus='V',clean_stus='C',fo_room_stus='V'
悲觀鎖(Pessimistic Lock)/ 樂觀鎖(Optimistic Lock) :
悲觀鎖(Pessimistic Lock) 每次獲取數(shù)據(jù)的時候笆搓,都會擔心數(shù)據(jù)被修改,所以每次獲取數(shù)據(jù)的時候都會進行加鎖纬傲,確保在自己使用的過程中數(shù)據(jù)不會被別人修改满败,使用完成后進行數(shù)據(jù)解鎖。由于數(shù)據(jù)進行加鎖嘹锁,期間對該數(shù)據(jù)進行讀寫的其他線程都會進行等待葫录。
樂觀鎖(Optimistic Lock):每次獲取數(shù)據(jù)的時候,都不會擔心數(shù)據(jù)被修改领猾,所以每次獲取數(shù)據(jù)的時候都不會進行加鎖,但是在更新數(shù)據(jù)的時候需要判斷該數(shù)據(jù)是否被別人修改過骇扇。如果數(shù)據(jù)被其他線程修改摔竿,則不進行數(shù)據(jù)更新,如果數(shù)據(jù)沒有被其他線程修改少孝,則進行數(shù)據(jù)更新继低。由于數(shù)據(jù)沒有進行加鎖,期間該數(shù)據(jù)可以被其他線程進行讀寫操作稍走。 適用場景:
悲觀鎖:比較適合寫入操作比較頻繁的場景袁翁,如果出現(xiàn)大量的讀取操作柴底,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷粱胜,降低了系統(tǒng)的吞吐量柄驻。
樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現(xiàn)大量的寫入操作焙压,數(shù)據(jù)發(fā)生沖突的可能性就會增大鸿脓,為了保證數(shù)據(jù)的一致性,應用層需要不斷的重新獲取數(shù)據(jù)涯曲,這樣會增加大量的查詢操作野哭,降低了系統(tǒng)的吞吐量。
總結(jié):兩種所各有優(yōu)缺點幻件,讀取頻繁使用樂觀鎖拨黔,寫入頻繁使用悲觀鎖。houseblock
#################################################################
1016 ./pullCode.sh
1017 cd jw-source/
1018 git log --stat
1019 git log --sortstat
1020 git log --stat --sortstat
1021 git log --sort stat
1022 git log --shortstat
1023 git log --author="jiann" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
1024 git log --author="bwliu" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
1025 git log --shortstat --author="jiann"
1026 git log --author="bwliu" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
1027 git log --author="jiann" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
1028 git log --author="jiann" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
1029 git log --shortstat --author="jiann" --since=1.days
1030 git log --shortstat --author="jiann" --since=1.days|wc -l
1031 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
1032 cd ..
1033 ls
1034 cd cw-hms-source/
1035 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
1036 cd ..
1037 ls
1038 cd cw-unit-interface/
1039 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
1040 cd ..
1041 ls
1042 cd cw-hms-web/
1043 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
1044 cd ..
1045 ls
1046 ./pullCode.sh
1047 clear
1048 ls
1049 ./pullCode.sh
1050 cleaer
1051 clear
1052 ls
1053 ./pullCode.sh
1054 clear
1055 ./pullCode.sh
1056 clear
1057 ./pullCode.sh
1058 clear
1059 ./pullCode.sh
1060 clear
1061 ./pullCode.sh
1062 cd cw-unit-interface/
1063 touch cwdbsqlscript.sql
1064 cd ..
1065 clear
1066 ls
1067 ./pullCode.sh
1068 clear
1069 ./pullCode.sh
1070 clear
1071 ls
1072 clear
1073 ./pullCode.sh
1074 perl -pi -e "s/aaa/bbb/gi" /mnt/cw-unit-interface/docker-center/a.txt
1075 cd /mnt
1076 ls
1077 ./pullCode.sh
1078 clear
1079 ls
1080 ./pullCode.sh
1081 mkdir softwarepms
1082 exit
1083 mkdir testdir
1084 sudo mkdir testdir
1085 su
1086 cd /media/softwareluke/Ubuntu\ 17.0/
1087 ls
1088 cd pmscodes/
1089 ls
1090 clear
1091 ls
1092 git clone -b develop git@gogs.jwops.cn:CW-NRD/cw-hms-web.git
1093 cd ..
1094 ls
1095 ls -ll pmscodes/
1096 mkdir softwarepmscode
1097 ls -ll
1098 clear
1099 cd /mnt
1100 ls
1101 mkdir jwpmsdir
1102 ls
1103 rm -rf jw-source
1104 rm -rf cw-hms-source
1105 clear
1106 ls
1107 cd /mnt
1108 ls
1109 cd jwpmsdir/
1110 ls
1111 touch 111 aaa
1112 222 bbb
1113 333 cccc
1114 ls
1115 touch a.txt b.txt
1116 vim a.txt
1117 vim b.txt
1118 awk 'NR==FNR{a[$1]=$2;}NR!=FNR && a[$1]{print $1","a[$1]","$2","$3}' a.txt b.txt
1119 awk -v OFS="," 'NR==FNR{a[$1]=$2;} NR!=FNR && $1 in a { print $1,a[$1],$2,$3}' a.txt b.txt
1120 ls
1121 touch repea
1122 vim repea
1123 awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(i=1;i<=length(a);i++)printf a[i]"\t";printf "\n"}' repea|sort|uniq
1124 awk '{a[$0]=$0;if (!($2 OFS $1 in a)) print a[$0] }' repea
1125 history
1126 ls
1127 awksedshell.sh
1128 touch awksedshell.sh
1129 vim awksedshell.sh
1130 clear