1. 程式人生 > >正確的使用@Transactional進行資料庫事務處理

正確的使用@Transactional進行資料庫事務處理

在spring工程中 中使用@Transactional實現事務,經常會出現事務失效的現象,是因為用@Transactional實現事務有特殊的要求:
1、只能是bean物件的public介面使用@Transactional
2、只能通過bean物件使用@Transactional介面

怎麼理解這兩個條件呢?通過一個例項場景來理解一下。
業務需求,往資料庫person表中新增資料,新增資料前,給person物件設定自維護的主鍵ID,其中獲取自維護主鍵ID介面需要獨立的事務。

錯誤的程式碼

Service介面檔案

public interface PersonService {
  Person InsertPerson(Person person);
}

Service實現類

@Service
public class PersonServiceImpl implements PersonService {
  //mybatis的資料處理mapper
  @Autowired
  private PersonMapper personMapper;

  @Override
  @Transactional
  public Person InsertPerson(Person person) {

    //設定person的主鍵ID
    person.setID(getID());

    personMapper.InsertPerson(person);
    return
Person; } //獲取資料庫中自維護的person主鍵ID 需要獨立的事務 @Transactional(propagation = Propagation.REQUIRES_NEW) private String getID() { return personMapper.getID(); } }

這段程式碼中入如InsertPerson發生異常,getID會和InsertPerson一起回滾,沒有達到getID獨立事務的要求。
這裡面getID函式是private方法,不滿足@Transactional使用條件而失效,getID獨立事務的業務需求無法實現。

如果把getID改成public方法如下:

  //獲取資料庫中自維護的person主鍵ID 需要獨立的事務
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public String getID() {
    return personMapper.getID();
  }

這樣還是無法實現getID獨立事務的業務需求。因為,沒有滿足只能通過bean物件使用@Transactional介面這個條件。

那麼怎麼滿足只能通過bean物件使用@Transactional介面這個條件呢?

正確的程式碼如下:

Service介面檔案

public interface PersonService {
  Person InsertPerson(Person person);
  String getID();
}

Service實現類

@Service
public class PersonServiceImpl implements PersonService {
  //mybatis的資料處理mapper
  @Autowired
  private PersonMapper personMapper;

  //自注入bean物件,這個很關鍵
  @Autowired
  private PersonService personService;

  @Override
  @Transactional
  public Person InsertPerson(Person person) {

    //設定person的主鍵ID
    //只能通過自注入的bean來獲取ID,啟動事務的關鍵點
    person.setID(personService.getID());

    personMapper.InsertPerson(person);
    return Person;
  }

  //獲取資料庫中自維護的person主鍵ID 需要獨立的事務
  @Override
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public String getID() {
    return personMapper.getID();
  }
}

相關推薦

正確的使用@Transactional進行資料庫事務處理

在spring工程中 中使用@Transactional實現事務,經常會出現事務失效的現象,是因為用@Transactional實現事務有特殊的要求: 1、只能是bean物件的public介面使用@Transactional 2、只能通過bean物件使用@T

資料庫-事務處理的概念和理論簡介

在看這一部分內容之前,我對資料庫一些基礎概念和基礎操作的認識十分淺薄,也沒有一些資料庫管理的經驗,因此當學這一部分的時候遇到了賊多理解上的誤區和困難。難受呀,基礎差真的不行。。。但是我已經沒有時間先從頭仔細學習資料庫基礎再學這一部分了,因此只能在泥濘中前行。即使在本文結束之前,好多概念我

MySQL資料庫事務處理

事務處理用於有效記錄某機構感興趣的業務活動(稱為事務)的資料處理(例如銷售、供貨的定購或貨幣傳輸)。通常,聯機事務處理 (OLTP) 系統執行大量的相對較小的事務。——百度百科 事務處理是將多個操作或者命令一起執行,所有命令全部成功執行才意味著該事務的成功,任何一個命令失敗

六、JDBC--獲取自動生成的主鍵值&處理Blob&資料庫事務處理

【孤立的技術是沒有價值的】,我們這裡只是為了瞭解具體的實現步驟:我們在插入資料的時候,經常會需要獲取我們插入的這一行資料對應的主鍵值。 具體的程式碼實現: /** * 獲取資料庫自動生成的主鍵 */ @Test public void testGetKey

SpringBoot----SQL資料庫事務處理

一、事務有四個特性:ACID 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成, 要麼完全不起作用。 一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀 態,而不會是

JAVA異常機制介紹/如何正確進行JAVA異常處理

1. 課前練習 在閱讀本文的內容之前,請從下面這段程式碼中找出異常處理有哪些不正確的地方。如果不能找出至少兩處錯誤,說明你還是一個“菜鳥”,對JAVA的異常處理機制還不夠了解,需要仔細閱讀本文的內容,並走查一下自己編寫的程式碼。如果你可以找出至少兩處錯誤,恭喜你,你已

Spring框架淺析 -- 資料庫事務處理

概述 在Spring框架淺析 -- 概述中,我們介紹過,Spring對於資料庫操作及事務處理的支援,是Spring功能中較為重要的一環。那麼資料庫事務是什麼?為什麼要Spring需要對資料庫操作及事務處理進行支援?Spring都提供了哪些方式對資料庫事務處理進行支援?這些方

JDBC應用程式連線資料庫--事務處理

JDBC應用程式連線資料庫–事務處理 事務概念 事務是指一組最小邏輯操作單元,裡面有多個操作組成,組成事務的每一部分必須要同時提交成功,如果有一個操作失敗,整個操作就需要回滾,事務要保證ACID特性。這在資料庫中已經涉及到,不在程式設計

Java中怎樣實現批量刪除操作(Java對資料庫進行事務處理)?

本人開發的一個安卓版app小遊戲,瘋狂猜明星android版,圖示看起來很搞笑,有點京劇變臉的味道。朋友們小手一抖,下載支援下。謝謝了 本文是記錄Java中實現批量刪除操作(Java對資料庫進行事務處理),在開始之前先來看下面這樣的一個頁面圖:  上面這張圖片顯示的是從

PHP使用PDO進行事務處理

value 增加 reat cep key 之前 upd 自動提交 catch 1.PDO執行SQL語句   exec()執行一條SQL語句,返回影響行數。   query()執行一條SQL語句,發揮結果集,結果集是一個PDOStatement對象。 2.什麽是事務   事

資料庫分庫分表 sharding 系列 四 多資料來源的事務處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

13-SpringBoot之資料庫(四)——事務處理:隔離級別與傳播行為

SpringBoot之資料庫(四)——事務處理:隔離級別與傳播行為 1. 隔離級別(isolation) 1.1 未提交讀 1.2 讀寫提交 1.3 可重複讀 1.4 序列化 1.5 使用合理的隔離級別

關於資料庫事務併發的理解和處理

關於資料庫事務併發的理解和處理 併發的概念:在作業系統中,併發是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行,但任一個時刻點上只有一個程式在處理機上執行。 在關係資料庫中,允許多個使用者同時訪問和更改共享資料的程序。 理解事務的概念

java資料庫程式設計(12)事務處理

Connection是預設將executeXXX(String sql)執行之後馬上提交給資料庫的,這樣一來,有時候如果需要處理一連串的sql語句(也就是事務,這裡不講解事務的相關知識),則需要將Connection的自動提交關掉,使用的方法為setAutoCommit(false)。在將事務

JDBC 中如何進行事務處理事務的 ACID 是指什麼

JDBC 中如何進行事務處理? 答:Connection 提供了事務處理的方法,通過呼叫setAutoCommit(false)可以設定手動提交事務;當事務完成 後用 commit()顯式提交事務;如果在事務處理過程中發生異常則通過 rollback() 進行事務回滾。除此之外,較新 的 J

MySQL資料庫基礎知識三(事務處理

事務指的是一組SQL語句,它們是一個執行單位,且在必要時還可以取消。事務處理是通過使用提交和回滾功能來實現的。 另一個用途確保某個操作所涉及的行不會在你正在使用它們時被其他客戶端修改。事務把多條語句定義為一個執行單位,防止在多客戶端環境裡可能會發生的併發問題。 事務系統通

Python連線Access資料庫遇到問題'ADODB.Connection', '未找到提供程式。該程式可能未正確安裝。'的處理辦法

  環境Windows7+python3.6.4 x64位+AccessDatabaseEngine_X64.exe,執行程式碼: import win32com.client conn = win32com.client.Dispatch(r'ADODB.Connection'

一個關於php使用pdo方式進行資料庫連線和處理的類

話不多說,先貼程式碼 <?php /** @DB Operates For PDO @author:MeeeeN @date:2015-10-22 22:40:32 **/ //定義資料庫資訊 header("Content-type:text/

JDBC 之插入Blob(圖片)& 批處理 & 資料庫事務

插入Blob欄位型別(如圖片) 實現批處理和 資料庫事務的一致性 一、插入Blob型別資料(如:圖片) 使用JDBC來寫入Blob型資料到資料庫中 資料庫中的Blob欄位比long欄位的效能要好,可以用來儲存如圖片之類的二進位制資料。 BLOB欄位由

Oracle宣佈在雲上正式上線 自治事務處理資料庫

在 8 月7日,Oracle 宣佈在雲上正式上線自治事務處理資料庫,這個名詞 ATP應對於早前釋