Spring Boot資料訪問 事務處理

2021-10-25 01:28:41 字數 4194 閱讀 9220

事務管理對於企業應用來說是至關重要的,當出現異常情況時,它也可以保證資料的一致性。

所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。在propagation定義中包括了如下幾個表示傳播行為的常量:

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免更新丟失、髒讀,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

@target()

@retention

(retentionpolicy.runtime)

@inherited

@documented

public @inte***ce

transactional

; string[

]rollbackforclassname()

default

; class<

?extends

throwable

>

norollbackfor()

default

; string[

]norollbackforclassname()

default

;}

#建立表

create

table

`user`(

id int

primary

keyauto_increment

,`name`

varchar(20

)not

null

comment

'名字'

, age int

, credits int

, create_time datetime);

#初始化資料

insert

into

`user`(

`name`

, age, credits, create_time)

values

('may',5

,100

, sysdate())

,('june',6

,100

, sysdate())

;

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

namespace

=>

"baseresult"

type

="com.yanyuan.first.entity.user"

>

property

="id"

column

="id"

jdbctype

="integer"

/>

property

="name"

column

="name"

jdbctype

="varchar"

/>

property

="age"

column

="age"

jdbctype

="integer"

/>

property

="credits"

column

="credits"

jdbctype

="integer"

/>

property

="createtime"

column

="create_time"

jdbctype

="timestamp"

/>

resultmap

>

"getbyid"

resultmap

="baseresult"

>

select * from user where id = #

select

>

"updatebyid"

parametertype

="com.yanyuan.first.entity.user"

>

update user

set name = # ,

age = #,

credits = #

where id = #

update

>

>

public

inte***ce

@override

public user getbyid

(integer id)

/** * 贈送積分,開啟事務

**/@override

@transactional

//開啟事務

public

boolean

donatecreditsopentransactional

(integer fromuid, integer touid, integer credits)

@override

public

boolean

donatecredits

(integer fromuid, integer touid, integer credits)

贈送積分:開啟事務
/**

* 贈送積分-開啟事務

*/@test

void

donatecreditsopentransactional()

catch

(exception e)

log.

info

("open transactional formuser : {}"

, userservice.

getbyid(1

)); log.

info

("open transactional touser : {}"

, userservice.

getbyid(2

));}

執行結果:發生異常,使用者1未減少積分使用者2未增加積分

/ by zero

open transactional formuser : user(id=1, name=may五月, age=5, credits=100, createtime=wed oct 14 00:44:49 cst 2020)

open transactional touser : user(id=2, name=june, age=6, credits=100, createtime=wed oct 14 00:44:49 cst 2020)

贈送積分:未開啟事務
/**

* 贈送積分

*/@test

void

donatecredits()

catch

(exception e)

log.

info

("formuser : {}"

, userservice.

getbyid(1

)); log.

info

("touser : {}"

, userservice.

getbyid(2

));}

執行結果:發生異常,使用者1減少了5積分使用者2未增加積分

/ by zero

formuser : user(id=1, name=may五月, age=5, credits=95, createtime=wed oct 14 00:44:49 cst 2020)

touser : user(id=2, name=june, age=6, credits=100, createtime=wed oct 14 00:44:49 cst 2020)

對應分支:data-transaction

Spring Boot 資料訪問

spring boot 使用spring data jpa簡化資料訪問層 推薦 spring boot 兩種多資料來源配置 jdbctemplate spring data jpa spring boot 使用nosql資料庫 一 redis spring boot 使用nosql資料庫 二 mon...

Spring Boot資料訪問

可以將orm理解成一種規範,它概述了這類框架的基本特徵,完成物件導向的程式語言到關係型資料庫的對映。簡而言之,orm就是應用程式和資料庫的橋梁。採用orm框架之後,應用程式不在直接訪問底層資料庫,而是以面相物件的方式來操作持久層物件 例如建立 刪除 修改等 而orm框架則將這些物件導向的操作轉換成底...

springboot 資料訪問

3.配置druid資料來源監控 整合mybatis 整合springdata jpa 對於資料訪問層,無論是sql還是nosql,spring boot預設採用整合spring data的方式進行統一處理,新增大量自動配置,遮蔽了很多設定。引入各種 template,repository來簡化我們對...