導航:首頁 > 程序命令 > 程序員代碼重復執行

程序員代碼重復執行

發布時間:2022-12-16 08:22:56

A. 程序員新人周一優化一行代碼,周三被勸退

這周一,公司新來了一個同事,面試的時候表現得非常不錯,各種問題對答如流,老闆和我都倍感欣慰。

這么優秀的人,絕不能讓他浪費一分一秒,於是很快,我就發他了需求文檔、源碼,讓他先在本地熟悉一下業務和開發流程。

結果沒想到,周三大家一塊 review 代碼的時候就發現了問題,新來的同事直接把原來 @Transactional 優化成了這個鬼樣子:

就因為這一行代碼,老闆(當年也是一線互聯網大廠的好手)當場就發飆了,馬上就要勸退這位新同事,我就趕緊打圓場,畢竟自己面試的人,不看僧面看佛面,是吧?於是老闆答應我說再試用一個月看看。

會議結束後,我就趕緊讓新同事復習了一遍事務,以下是他自己做的總結,還是非常詳細的,分享出來給大家一點點參考和啟發。相信大家看完後就明白為什麼不能這樣優化 @Transactional 註解了,純屬畫蛇添足和亂用。

事務在邏輯上是一組操作, 要麼執行,要不都不執行 。主要是針對資料庫而言的,比如說 MySQL。

只要記住這一點,理解事務就很容易了。在 java 中,我們通常要在業務裡面處理多個事件,比如說編程喵有一個保存文章的方法,它除了要保存文章本身之外,還要保存文章對應的標簽,標簽和文章不在同一個表裡,但會通過在文章表裡(posts)保存標簽主鍵(tag_id)來關聯標簽表(tags):

那麼此時就需要開啟事務,保證文章表和標簽表中的數據保持同步,要麼都執行,要麼都不執行。

否則就有可能造成,文章保存成功了,但標簽保存失敗了,或者文章保存失敗了,標簽保存成功了——這些場景都不符合我們的預期。

為了保證事務是正確可靠的,在資料庫進行寫入或者更新操作時,就必須得表現出 ACID 的 4 個重要特性:

其中,事務隔離又分為 4 種不同的級別,包括:

需要格外注意的是: 事務能否生效,取決於資料庫引擎是否支持事務,MySQL 的 InnoDB 引擎是支持事務的,但 MyISAM 就不支持

1)編程式事務

編程式事務是指將事務管理代碼嵌入嵌入到業務代碼中,來控制事務的提交和回滾。

你比如說,使用 TransactionTemplate 來管理事務:

再比如說,使用 TransactionManager 來管理事務:

就編程式事務管理而言,Spring 更推薦使用 TransactionTemplate。

在編程式事務中,必須在每個業務操作中包含額外的事務管理代碼,就導致代碼看起來非常的臃腫,但對理解 Spring 的事務管理模型非常有幫助。

當然了,要想實現事務管理和業務代碼的抽離,就必須得用到 Spring 當中最關鍵最核心的技術之一,AOP,其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,執行完目標方法之後根據執行的情況提交或者回滾。

Spring 將事務管理的核心抽象為一個事務管理器(TransactionManager),它的源碼只有一個簡單的介面定義,屬於一個標記介面:

通過 PlatformTransactionManager 這個介面,Spring 為各個平台如 JDBC(DataSourceTransactionManager)、Hibernate(HibernateTransactionManager)、JPA(JpaTransactionManager)等都提供了對應的事務管理器,但是具體的實現就是各個平台自己的事情了。

參數 TransactionDefinition 和 @Transactional 註解是對應的,比如說 @Transactional 註解中定義的事務傳播行為、隔離級別、事務超時時間、事務是否只讀等屬性,在 TransactionDefinition 都可以找得到。

返回類型 TransactionStatus 主要用來存儲當前事務的一些狀態和數據,比如說事務資源(connection)、回滾狀態等。

TransactionDefinition.java:

Transactional.java

說到這,我們來詳細地說明一下 Spring 事務的傳播行為、事務的隔離級別、事務的超時時間、事務的只讀屬性,以及事務的回滾規則。

當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播 ,例如,方法可能繼續在當前事務中執行,也可以開啟一個新的事務,在自己的事務中執行。

TransactionDefinition 一共定義了 7 種事務傳播行為:

01、 PROPAGATION_REQUIRED

這也是 @Transactional 默認的事務傳播行為,指的是如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。更確切地意思是:

這個傳播行為也最好理解,aMethod 調用了 bMethod,只要其中一個方法回滾,整個事務均回滾。

02、 PROPAGATION_REQUIRES_NEW

創建一個新的事務,如果當前存在事務,則把當前事務掛起。也就是說不管外部方法是否開啟事務,Propagation.REQUIRES_NEW 修飾的內部方法都會開啟自己的事務,且開啟的事務與外部的事務相互獨立,互不幹擾。

如果 aMethod()發生異常回滾,bMethod()不會跟著回滾,因為 bMethod()開啟了獨立的事務。但是,如果 bMethod()拋出了未被捕獲的異常並且這個異常滿足事務回滾規則的話,aMethod()同樣也會回滾。

03、 PROPAGATION_NESTED

如果當前存在事務,就在當前事務內執行;否則,就執行與 PROPAGATION_REQUIRED 類似的操作。

04、 PROPAGATION_MANDATORY

如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。

05、 PROPAGATION_SUPPORTS

如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。

06、 PROPAGATION_NOT_SUPPORTED

以非事務方式運行,如果當前存在事務,則把當前事務掛起。

07、 PROPAGATION_NEVER

以非事務方式運行,如果當前存在事務,則拋出異常。

3、4、5、6、7 這 5 種事務傳播方式不常用,了解即可。

前面我們已經了解了資料庫的事務隔離級別,再來理解 Spring 的事務隔離級別就容易多了。

TransactionDefinition 中一共定義了 5 種事務隔離級別:

通常情況下,我們採用默認的隔離級別 ISOLATION_DEFAULT 就可以了,也就是交給資料庫來決定,可以通過 SELECT @@transaction_isolation; 命令來查看 MySql 的默認隔離級別,結果為 REPEATABLE-READ,也就是可重復讀。

事務超時,也就是指一個事務所允許執行的最長時間,如果在超時時間內還沒有完成的話,就自動回滾。

假如事務的執行時間格外的長,由於事務涉及到對資料庫的鎖定,就會導致長時間運行的事務佔用資料庫資源。

如果一個事務只是對資料庫執行讀操作,那麼該資料庫就可以利用事務的只讀屬性,採取優化措施,適用於多條資料庫查詢操作中。

這是因為 MySql(innodb)默認對每一個連接都啟用了 autocommit 模式,在該模式下,每一個發送到 MySql 伺服器的 SQL 語句都會在一個單獨的事務中進行處理,執行結束後會自動提交事務。

那如果我們給方法加上了 @Transactional 註解,那這個方法中所有的 SQL 都會放在一個事務里。否則,每條 SQL 都會單獨開啟一個事務,中間被其他事務修改了數據,都會實時讀取到。

有些情況下,當一次執行多條查詢語句時,需要保證數據一致性時,就需要啟用事務支持。否則上一條 SQL 查詢後,被其他用戶改變了數據,那麼下一個 SQL 查詢可能就會出現不一致的狀態。

默認情況下,事務只在出現運行時異常(Runtime Exception)時回滾,以及 Error,出現檢查異常(checked exception,需要主動捕獲處理或者向上拋出)時不回滾。

如果你想要回滾特定的異常類型的話,可以這樣設置:

以前,我們需要通過 XML 配置 Spring 來託管事務,有了 Spring Boot 之後,一切就變得更加簡單了,只需要在業務層添加事務註解( @Transactional )就可以快速開啟事務。

也就是說,我們只需要把焦點放在 @Transactional 註解上就可以了。

雖然 @Transactional 註解源碼中定義了很多屬性,但大多數時候,我都是採用默認配置,當然了,如果需要自定義的話,前面也都說明過了。

1)要在 public 方法上使用,在類的computeTransactionAttribute方法中有個判斷,如果目標方法不是public,則TransactionAttribute返回null,即不支持事務。

2)避免同一個類中調用 @Transactional 註解的方法,這樣會導致事務失效。

在測試之前,我們先把 Spring Boot 默認的日誌級別 info 調整為 debug,在 application.yml 文件中 修改:

然後,來看修改之前查到的數據:

開搞。在控制器中添加一個 update 介面,准備修改數據,打算把沉默王二的狗腿子修改為沉默王二的狗腿:

在 Service 中為方法加上 @Transactional 註解並拋出運行時異常:

按照我們的預期,當執行 save 保存數據後,因為出現了異常,所以事務要回滾。所以數據不會被修改。

在瀏覽器中輸入 http://localhost:8080/user/update 進行測試,注意查看日誌,可以確認事務起效了。

當我們把事務去掉,同樣拋出異常:

再次執行,發現雖然程序報錯了,但數據卻被更新了。

這也間接地證明,我們的 @Transactional 事務起效了。

看到這,是不是就明白為什麼新同事的優化純屬畫蛇添足/卵用了吧?

B. 中國的程序員,真的「短命」嗎

程序員工作強度大,可能經常會有報道說各種猝死之類的,但是各行各業都有這樣的情況。只是程序員的報道出來了。程序員經常加班是真的,因為工作強度大,所以工資都比較高。

C. 怎麼利用BAT打開同一個程序多次

@echooff
title關閉本窗口即可停止打開程序
:head
cls
call你的程序.exe
goto:head
rem這個批處理打開程序後,會等待程序運行結束,程序運行結束後,才會再次打開程序

D. 要做程序員需要學會什麼

其實簡單來說,程序員的工作就是使用編程語言,根據需求寫出一個程序。
但是,在這個過程中,涉及如下幾個方面:

使用的編程語言 程序員需要選擇一門或者多門語言來編程,不同的語言適合編寫不同的程序,目前主流編程語言包括,Java、JavaScript、Python、C++、php以及其他小語種等等,每種編程語言適合開發的程序有所不同。目前從程序應用分來,主要可以分為三類a 企業應用,主要用於解決企業業務。各種企業管理後台系統,銀行系統,公安系統,圖書管理系統等等。
b 互聯網應用,面向互聯網用戶,為互聯網用戶提供各類服務。比如現在的京東淘寶各類電商系統等。
c 移動應用,各類在移動端使用的APP,有面向互聯網用戶的APP,也有面向企業內部的APP。
目前相對而言,在移動應用和互聯網應用方面,資本投入比較熱的風口,程序員的薪資較高。企業應用,發展了很多年,相對平穩。

2. 明白需求,實現需求
需求就是編寫程序的要求。一個程序要編寫成什麼樣子,具備哪些功能,都是由需求來具體說明。程序員要需要能看懂需求文檔,並且能准確地使用編程語言,根據需求中的要求來編寫成程序。企業開發的項目,往往會由該程序的架構師提供一個程序框架,程序員在該框架的規范下進行編程,實現需求的功能,以確保程序的規范、可讀,以及可維護性。

3. 日常工作寫程序
一個軟體開發一般流程是產品經理根據用戶需求做一個項目出來,然後UI設計師做一些圖片設計,前端開發編寫頁面,後台開發編寫核心編程,然後介入一些大數據和人工智慧,通過測試之類上線實施,後期還有運維進行相關維護。
程序員一般大多指的是前端和後台寫代碼程序的開發人員,除了編寫代碼,可能還需要通過介面和其它系統對接,實現系統間的數據交換。像單體測試,是程序員對自己寫好的程序單元進行測試,檢測這個程序單元數據輸入和數據輸出是否符合預期等等。測試出來的問題,需要修改正確,然後再測試,直至沒有問題。和同事共同開發的時候也需要聯合測試,以及用戶測試過後如果存在BUG繼續進行修改。

E. 簡述程序設計的三種基本程序結構,其執行的條件和順序

1、順序結構:順序結構是一種線性、有序的結構,它依次執行各語句模塊。

2、循環結構:循環結構是重復執行一個或幾個模塊,直到滿足某一條件為止。

3、選擇結構:選擇結構是根據條件成立與否選擇程序執行的通路。

當型循環:表示先判斷條件,當滿足給定的條件時執行循環體,並且在循環終端處流程自動返回到循環入口;如果條件不滿足,則退出循環體直接到達流程出口處。因為是"當條件滿足時執行循環",即先判斷後執行,所以稱為當型循環。

(5)程序員代碼重復執行擴展閱讀:

注意事項

1、使用順序、選擇、循環等有限的基本結構表示程序邏輯。

2、選用的控制結構只准許有一個入口和一個出口

3、程序語句組成容易識別的塊,每塊只有一個入口和一個出口。

4、復雜結構應該用基本控制結構進行組合或嵌套來實現。

5、程序設計語言中沒有的控制結構,可用一段等價的程序段模擬,但要求改程序段在整個系統中應前後一致。

6、嚴格控制GOTO語句。

閱讀全文

與程序員代碼重復執行相關的資料

熱點內容
如何批量快速壓縮視頻 瀏覽:432
我的世界如何加入ice伺服器 瀏覽:873
兄弟cnc編程說明書 瀏覽:204
php閃電入門教程學習 瀏覽:152
金岳霖邏輯pdf 瀏覽:938
linuxtomcat線程 瀏覽:77
pboc長度加數據加密 瀏覽:187
英雄聯盟國際服手游怎麼下安卓 瀏覽:297
程序員的思路 瀏覽:234
只能用命令獲得的四種方塊 瀏覽:358
怎麼用命令方塊防止開創造 瀏覽:807
掃描版的pdf 瀏覽:790
編程貓怎樣做3d游戲 瀏覽:207
怎麼查找雲伺服器上的ftp 瀏覽:156
我的世界伺服器如何注冊賬號 瀏覽:934
統計英文字元python 瀏覽:423
linux信息安全 瀏覽:908
壓縮機接線柱爆 瀏覽:999
程序員自主創業 瀏覽:584
匯編程序員待遇 瀏覽:359