1、事務(wù)使用
在代碼中使用事務(wù)很簡(jiǎn)單,只需要在方法上添加好@Transactional注解即可
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 服務(wù)實(shí)現(xiàn)類
* </p>
* @author 小吾
* @since 2020-05-21
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
/**
* 在方法上加上@Transactional注解,即可
*/
@Transactional(rollbackFor = Exception.class)
public String transactionNo1() {
User user = new User();
user.setName("小吾1號(hào)");
user.setSex(1);
userMapper.insert(user);
System.out.println("沒(méi)有異常事務(wù)不會(huì)觸發(fā),生成數(shù)據(jù)");
return "新增成功,沒(méi)有異常";
}
@Transactional(rollbackFor = Exception.class)
public String transactionNo2() {
User user = new User();
user.setName("小吾2號(hào)");
user.setSex(1);
userMapper.insert(user);
//這里我們給他出現(xiàn)一個(gè)異常使事務(wù)進(jìn)行回滾
int x = 2 / 0;
//如果我們這里想要拋出自己的異常第岖,可以使用try{}catch (){}拋出自定義異常信息
System.out.println("這一段輸出,就不會(huì)輸出试溯,直接執(zhí)行事務(wù)回滾操作");
return "新增失敗蔑滓,異常捕獲,事務(wù)回滾";
}
}
2、@Transactional簡(jiǎn)單介紹+使用方式
- @Transactional注解使用在接口實(shí)現(xiàn)類或者接口實(shí)現(xiàn)方法上键袱,不能實(shí)現(xiàn)在接口類中
- @Transactional注解方法不能被
其他方法間接
調(diào)用燎窘,否則事務(wù)會(huì)失效
/** 我們通過(guò)非事務(wù)方法調(diào)用事務(wù)方法,這時(shí)會(huì)導(dǎo)致事務(wù)失效 */
public String transactionNo3() {
return transactionalNo3();
}
/** 這里觸發(fā)異常蹄咖,小吾3號(hào)會(huì)直接新增褐健,不會(huì)進(jìn)行回滾 */
@Transactional(rollbackFor = Exception.class)
public String transactionalNo3(){
User user = new User();
user.setName("小吾3號(hào)");
user.setSex(1);
userMapper.insert(user);
int x = 2 / 0;
return "新增失敗,異常捕獲澜汤,事務(wù)回滾";
}
- @Transactional注解只能使用在public方法上面蚜迅,否則事務(wù)會(huì)失效。例:作用在private方法
/**
* 我們?cè)诳刂茖臃椒ㄉ鲜褂胮rivate這時(shí)我們會(huì)發(fā)現(xiàn)事務(wù)失效俊抵,數(shù)據(jù)新增成功
*/
@GetMapping("/transactionNo4")
@Transactional(rollbackFor = Exception.class)
private String transactionNo4(){
System.out.println("測(cè)試事務(wù)是否回滾成功谁不,方法4-非public方法使用事務(wù)");
User user = new User();
user.setName("小吾4號(hào)");
user.setSex(1);
userMapper.insert(user);
//備注,我在控制層使用mapper接口是相當(dāng)不符合代碼規(guī)范的徽诲,這里只用于測(cè)試刹帕,勿怪
int x = 2 / 0;
return "方法4";
}
- @Transactional注解對(duì)方法內(nèi)線程方法無(wú)法作用到,線程出現(xiàn)異常也無(wú)法導(dǎo)致事務(wù)回滾
@Transactional(rollbackFor = Exception.class)
public String transactionNo5() {
User user = new User();
user.setName("小吾5號(hào)");
user.setSex(1);
userMapper.insert(user);
Timer timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
System.out.println("hello");
//線程內(nèi)部出現(xiàn)異常谎替,并不會(huì)導(dǎo)致事務(wù)回滾
int x = 2/0;
}
},2000,4000
);
//同時(shí)線程外部異常也不會(huì)導(dǎo)致線程停止偷溺,但會(huì)使事務(wù)回滾
int x = 2 / 0;
return "事務(wù)與線程";
}
@Transactional注解 rollbackFor默認(rèn)是捕獲(RuntimeException)運(yùn)行時(shí)異常
類以及其子類的,當(dāng)方法拋出(checked exception)編譯時(shí)異常
是不會(huì)進(jìn)行捕獲的院喜,例如:IOException亡蓉;需要捕獲這類異常我們就要修改rollbackFor的作用范圍。
Transactional.png
關(guān)于事務(wù)的介紹還有很多的不足喷舀,這里我們只做了一些簡(jiǎn)單的使用和介紹,后期會(huì)不定期更新淋肾。
至此SpringBoot事務(wù)回滾簡(jiǎn)單使用就寫完了硫麻,如有不懂可以加
SpringBoot技術(shù)交流群14群號(hào):719099151
我是小吾,有問(wèn)題可以直接在群里@我