手撕Spring5框架(九)事務管理

2021-10-24 12:14:41 字數 3687 閱讀 5884

事務是資料庫操作最基本單元,邏輯上的一組操作,要麼都成功,如果有乙個失敗所有操作都失敗。

原子性:不可分割,要麼成功,要麼都失敗。

一致性:操作之前和操作之後的總量是不變得。

隔離性:多事務間不影響。

永續性:事務提交後,表中資料發生持久變化。

典型場景:銀行轉賬

場景描述:小明去銀行轉賬給小紅100元,小明執行轉賬方法,方法執行後,小明的賬戶減少100元,小紅的賬戶增加100元。

`user_name` varchar(55) character set utf8 collate utf8_general_ci null default null comment '使用者名稱',

`money` decimal(11, 2) null default null comment '賬戶金額',

primary key (`id`) using btree

) engine = innodb character set = utf8 collate = utf8_general_ci row_format = dynamic;

-- ----------------------------

-- records of t_account

-- ----------------------------

insert into `t_account` values (1, '小明', 1000.00);

insert into `t_account` values (2, '小紅', 1000.00);

set foreign_key_checks = 1;

package org.learn.spring5.service;

public inte***ce userservice

package org.learn.spring5.service.impl;

import org.learn.spring5.dao.userdao;

import org.learn.spring5.service.userservice;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.stereotype.service;

@service

public class userserviceimpl implements userservice

}

package org.learn.spring5.dao.impl;

import org.learn.spring5.dao.userdao;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.jdbc.core.jdbctemplate;

import org.springframework.stereotype.component;

@component

public class userdaoimpl implements userdao ;

int update = jdbctemplate.update(sql, args);

return update;

}public int addmoney() ;

int update = jdbctemplate.update(sql, args);

return update;}}

package org.learn.spring5.dao;

public inte***ce userdao

package org.learn.spring5.dao.impl;

import org.learn.spring5.dao.userdao;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.jdbc.core.jdbctemplate;

import org.springframework.stereotype.component;

@component

public class userdaoimpl implements userdao ;

int update = jdbctemplate.update(sql, args);

return update;

}public int addmoney() ;

int update = jdbctemplate.update(sql, args);

return update;}}

<?xml version="1.0" encoding="utf-8"?>

從上面**我們可以分析出,service層用於處理業務,具體有兩部操作,小明轉賬,賬戶減少100元,和小紅賬戶增加100元

dao層用於運算元據庫,分別執行了小明賬戶減少100和小紅賬戶增加100的資料操作,如果我們沒有使用事務發生異常會發生什麼問題呢?

假如在處理如上業務邏輯時1.小明轉賬,賬戶減少100,當執行完這步操作時,網路突然中斷,沒有執行下一步操作,這時候資料庫會執

行小明賬戶減少100元的操作,結果是小明的賬戶減少100,而小紅的賬戶金額沒有發生變化。這種情況明顯是錯誤的。正常情況應該是如果轉賬成功,小明賬戶減少100,小紅賬戶增加100。如果發生異常,小明和小紅的賬戶金額應該保持不變。如何處理這個問題呢?事務的引入就可以解決這個問題,讓我們在回顧一下事務的定義:邏輯上的一組操作,要麼都成功,如果有乙個失敗所有操作都失敗。

增加事務的步驟

在要增加事務的方法內新增如下的**流程

1、開啟事務

2、進行業務操作

3、如果沒有發生異常,事務提交

4、如果在處理業務邏輯時出現異常,事務回滾

@autowired

private userdao userdao;

public void transferaccount() catch(exception e)

//4.事務提交

}

思考乙個問題,如果系統中存在很多功能,每個功能的業務邏輯處理的service類都需要增加事務**的編寫,會發生什麼問題?第一,**會變得非常臃腫,冗餘。

第二,業務方法功能變得複雜而不清晰。

然而,spring整合了對事務的管理,恰恰解決了這些問題,大大減少了程式設計師的**量,也對事務有了很好的管理控制。業務層只需要專心業務的處理。

本章節主要對事務進行了乙個介紹,如何用spring實現事務管理我們將會下個章節介紹。

Spring5常用註解

用於建立物件的註解 component 用於建立物件,相當於xml檔案中配置的乙個bean 屬性只有乙個value,用來指定id,預設是當前類的類名,首字母小寫。下面三個註解是 component的衍生註解,作用和屬性相同,只不過提供了更加詳細的語義化。controller 一般用於表現層的註解 s...

Spring5框架中IOC的概念 原理

三 ioc中beanfactory介面 一 什麼是ioc 什麼是ioc呢,上章節只是簡單的提出這個概念是控制反轉,其實簡單的講呢,有兩個點。控制反轉,把物件建立和物件之間的呼叫過程,交給spirng進行管理。使用ioc的目的,為了降低耦合度。二 ioc底層原理 ioc底層原理 ioc過程 通過xml...

Spring5開發新功能

配置檔案在config裡面,其他邏輯在微服務包中 1.編寫資料訪問層 介面名為i yyydao,以i開頭表示介面以dao結尾。對應的實現類名為 yyydaoimpl 2.編寫業務層 介面名為i yyyservice,以i開頭表示介面以service結尾 對應的實現類名為 yyyserviceimpl...