事務(wù)的概念和簡單使用
1.什么是聲明式事務(wù)娘香?
以方法為單位,進(jìn)行事務(wù)控制;拋出異常,事務(wù)回滾,最小的執(zhí)行單位為方法匀泊,決定執(zhí)行成敗是通過是否拋出異常來判斷的,拋出異常即執(zhí)行失敗
- Spring的聲明事務(wù)實(shí)現(xiàn)
[1]事務(wù)管理是應(yīng)用系統(tǒng)開發(fā)中必不可少的一部分朵你。Spring 為事務(wù)管理提供了豐富的功能支持各聘。Spring 事務(wù)管理分為編碼式和聲明式的兩種方式。編程式事務(wù)指的是通過編碼方式實(shí)現(xiàn)事務(wù)撬呢;
聲明式事務(wù)基于 AOP,將具體業(yè)務(wù)邏輯與事務(wù)處理解耦伦吠。聲明式事務(wù)管理使業(yè)務(wù)代碼邏輯不受污染, 因此在實(shí)際使用中聲明式事務(wù)用的比較多。
聲明式事務(wù)有兩種方式,一種是在配置文件(xml)中做相關(guān)的事務(wù)規(guī)則聲明毛仪,另一種是基于@Transactional 注解的方式搁嗓,下面我們是針對注解的使用進(jìn)行講解
@Transactional:事務(wù)注解,對我們的實(shí)例類進(jìn)行事務(wù)聲明
它可以加到類上箱靴,也可以加到方法上腺逛,加到類上時,對類上的所有公有方法生效衡怀。如果類上也有棍矛,方法上也有,方法上的屬性會覆蓋類上的抛杨。
加到service的實(shí)現(xiàn)類上够委。
@EnableTransactionManagement 事務(wù)管理注解,開啟事務(wù)管理器,對聲明了@Transactional的類進(jìn)行管理
1主啟動類上加@EnableTransactionManagement 開啟事務(wù)管理
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
@EnableTransactionManagement
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2 service的實(shí)現(xiàn)類上加transactional 注解怖现,并在其中模擬產(chǎn)生異常茁帽,看是否回滾
package com.example.demo.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.domain.Person;
import com.example.demo.domain.Population;
import com.example.demo.domain.ResultMsg;
import com.example.demo.mapper.PersonMapper;
import com.example.demo.mapper.PopulationMapper;
@Service
@Transactional(rollbackFor={RuntimeException.class,Exception.class})
public class PopulationServiceImpl implements IPopulationService {
@Resource
PopulationMapper populationMapper;
@Resource
PersonMapper personMapper;
@Override
@Transactional
public ResultMsg save(Person person, Population population) {
ResultMsg rm=new ResultMsg();
//補(bǔ)全戶主名稱
population.setHouseHolder(person.getName());
//存戶口信息
int count=populationMapper.insert(population);
//模擬產(chǎn)生異常,看是否回滾
int i=0;
int y=2/i;
if(count>0){
//戶口存儲成功屈嗤,獲取戶號
String popid=population.getId();
//設(shè)置人員戶號
person.setPopulationId(popid);
int count2=personMapper.insert(person);
if(count2>0){
rm=new ResultMsg(0,"成功");
}else{
rm=new ResultMsg(-1,"人員信息失敗");
}
}else{
rm=new ResultMsg(-1,"戶口信息存儲失敗");
}
return rm;
}
}
事務(wù)的傳播行為
事務(wù)傳播行為
@Transactional 注解中的 propagation 屬性潘拨,可以設(shè)置事務(wù)傳播行為。屬性值為:
REQUIRED:如果當(dāng)前沒有事務(wù)饶号,就新建一個事務(wù)铁追,如果已經(jīng)存在一個事務(wù)中,就加入到這個事務(wù)中茫船。這是最常見的選擇琅束。
SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù)算谈,就以非事務(wù)方式執(zhí)行狰闪。
MANDATORY:使用當(dāng)前的事務(wù),如果當(dāng)前沒有事務(wù)濒生,就拋出異常埋泵。
REQUIRES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù)罪治,把當(dāng)前事務(wù)掛起丽声。
NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果存在事務(wù)觉义,就把當(dāng)前事務(wù)掛起雁社。
NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)晒骇,則拋出異常霉撵。
-
NESTED:嵌套事務(wù)執(zhí)行磺浙,如果沒有事務(wù)就按REQUIRED來執(zhí)行,也就是新建一個事務(wù)
它能讓事務(wù)部分回滾@Transactional(propagation=Propagation.REQUIRED)
public ResultMsg save(Person person, Population population) {
.......
}
1徒坡、用NESTED
https://www.cnblogs.com/yifanSJ/p/16330741.html
事務(wù)A 中包含B事務(wù)(批量插入時(事物A) 會調(diào)用單個插入操作(事務(wù)b)),
如果B失敗了撕氧,只會回滾B,a會被提交
a->執(zhí)行B之前設(shè)置了savepoint
2喇完、如果用REQUIRED,如果B失敗了伦泥,ab都回滾