事務管理對於企業應用來說是至關重要的,當出現異常情況時,它也可以保證資料的一致性。
所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。在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對應分支:data-transactionformuser : 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)
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來簡化我們對...