spring基礎 宣告式事務

2021-09-25 12:24:35 字數 4386 閱讀 5863

一些xml與對應的註解

載入jdbc的檔案 ----@propertysource

-----------@componentscan

如果要使用註解注入或者set方式注入,都必須要先將物件加入到ioc容器中,註解用@bean,xml用

###事務:

一組最小單位的執行單元(一組sql語句),要麼一起成功,要麼一起失敗!!

事務的四個特性(acid)?

原子性(a):如果使用事務控制對操作進行控制,這些操作要麼一起成功,要麼一起失敗!!

一致性(c):事務可以讓資料庫從乙個一致性狀態切換到另乙個一致性的狀態**賬總額不變)

隔離性(i):多個併發事務之間應該相互隔離。

​ 如果多個併發事務隔離出問題,可能導致以下現象:

​ 1)髒讀:乙個事務讀到另乙個未提交的資料(必須防止的)

​ 2)不可重複讀:乙個事務讀到另乙個已經提交的更新(update)資料

​ 3)幻讀(虛讀) : 乙個事務讀到另乙個已經提交的插入(insert)資料

注意:​ 1)mysql的預設隔離級別:repeatable read

​ oracle的預設隔離級別: read committed

​ 2)隔離級別越高,事務併發效能越差

匯入spring-tx包,檢視api

>

>

org.springframeworkgroupid

>

>

spring-txartifactid

>

>

5.0.2.releaseversion

>

dependency

>

|- platformtransactionmanager 頂層介面 (spring-tx) (spring提供用於進行事務控制的方法的介面)

​ |- datasourcetransactionmanager 實現類 (spring-jdbc)

​ (spring提供用於進行事務控制的方法的實現**,底層呼叫jdbc事務控制**)

​ |- hibernatetransactionmanager 實現類(spring-orm)(spring提供對hibernate事務控制實現)

​ |- jpatransactionmanager 實現 (spring-orm)(spring提供對jpa事務控制實現)

作用:設定事務的隔離級別

設定事務的傳播行為(設定事務的邊界!)

propagation_required: 預設值,必須讓當前(業務)方法在事務的控制下執行。

​ 如果該方法沒有事務,自動新增事務

​ 如果該方法已經有了事務,直接使用當前事務。

​ 專案的常用的方法:增加,刪除,更新方法!

propagation_supports: 讓當前(業務)方法在可選事務中執行(事務可有可無)

​ 如果該方法沒有事務,該方法就沒有事務。

​ 如果該方法已經有了事務,直接使用當前事務。

​ 專案的常用的方法:查詢方法!

(xml實現事務配置)專案演示步驟:

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

測試

ackage com.huihui.test;

import com.huihui.pojo.account;

import com.huihui.service.accountservice;

import org.junit.test;

import org.junit.runner.runwith;

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

import org.springframework.test.context.contextconfiguration;

import org.springframework.test.context.junit4.springjunit4classrunner;

/** * 測試事務控制

*/@runwith(springjunit4classrunner.class)

public class demo1

}

(xml+註解實現事務配置)專案演示步驟:

要在業務類上新增:@transactional註解

賬戶service實現

* @transactional 註解的使用

* 1.位置問題

* 1.2 業務類的方法上: 對某個類的方法新增事務控制

* 1.3 業務介面上: 對介面宣告的所有方法新增事務控制

* 1.3 業務介面的方法上: 對介面宣告的指定方法新增事務控制

* * 注意:類和方法同時存在,優先使用方法上的

* 2.屬性問題

* transactionmanager: 引用的事務管理器的id

* 預設@transactional根據型別進行注入

* 如果有多個型別才會按照名稱進行注入

* value: 和transactionmanager的值一樣的

* * isolation: 設定事務的隔離級別

* propagation: 設定事務的傳播行為

* rollbackfor: (理論)針對某些異常進行事務回滾 (實際測試,所有異常都可以進行事務控制 )

* norollbackfor: 針對某些異常不進行事務回滾 (實際測試是ok的)

*/@transactional(isolation = isolation.default,

propagation = propagation.required,

norollbackfor = nullpointerexception.class ) // 事務註解

public class accountserviceimpl implements accountservice

}

(純註解實現事務配置)專案演示步驟:

配置類:

/**

* 配置類

*/@configuration

@componentscan(basepackages = "com.huihui")

@enabletransactionmanagement // 開啟事務管理註解掃瞄,代替:@import(jdbcconfig.class) //匯入資料來源配置類

public class springconfig

資料來源配置類:

/**

* 資料來源配置類

*/@propertysource("jdbc.properties")

public class jdbcconfig ")

private string url;

@value("$")

private string driver;

@value("$")

private string username;

@value("$")

private string password;

/*** 建立資料來源

*/@bean("datasource") // 放入spring的ioc容器

public datasource createdatasource()

/*** 建立jdbctemplate

* @qualifier("datasource") datasource datasource: 在springioc容器查詢乙個datasource的物件,注入進來

*/@bean("jdbctemplate")

public jdbctemplate createjdbctemplate(@qualifier("datasource") datasource datasource)

/*** 建立事務管理器

*/@bean("transactionmanager")

public datasourcetransactionmanager createtransactionmanager(@qualifier("datasource") datasource datasource)

}

Spring宣告式事務

net.sf.hibernate.dialect.oracle9dialect false true net.sf.hibernate.transaction.jdbctransactionfactory 1025 用heibernate來管理事務 當用spring和heibernate一起完成da...

spring宣告式事務

1.什麼是事務 事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性 要麼成功,要麼失敗 2.事務的特性 事務特性分為四個 原子性 atomicity 一致性 consistency 隔離性 isolation 持續性 durability ...

Spring 宣告式事務

propagation 事務傳播機制有如下幾種 required 預設值,表示如果存在乙個事務,則支援當前事務 如果沒有事務,則開啟乙個新事務。requires new 表示總是開啟乙個新的事務,如果乙個事務已經存在,則將這個存在的事務掛起,開啟新事務執行該方法。mandatory 表示如果存在乙個...