4中隔離級別
數據庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的並發操作中可能會出現臟讀,不可重復讀,幻讀。下面通過事例一一闡述它們的概念與聯系。
Read uncommitted
讀未提交,顧名思義,就是一個事務可以讀取另一個未提交事務的數據。
事例:老板要給程序員發工資,程序員的工資是3.6萬/月。但是發工資時老板不小心按錯了數字,按成3.9萬/月,該錢已經打到程序員的戶口,但是事務還沒有提交,就在這時,程序員去查看自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老板及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。
分析:實際程序員這個月的工資還是3.6萬,但是程序員看到的是3.9萬。他看到的是老板還沒提交事務時的數據。這就是臟讀。
那怎么解決臟讀呢?Read committed!讀提交,能解決臟讀問題。
Read committed
讀提交,顧名思義,就是一個事務要等另一個事務提交后才能讀取數據。
Repeatable read(mysql默認使用級別)
上面的說法並不是很嚴謹 嚴謹說法應該是重復讀取的數據是可以被更新的,但是數據庫會使用快照機制保證當前讀取的人獲得的數據是沒有被改變的
什么時候會出現幻讀?
Serializable 序列化(不推薦使用)
springboot中使用事務
spring中的5大事務隔離級別和7大事務傳播屬性
https://zhuanlan.zhihu.com/p/112183409
spring Boot 使用事務非常簡單,首先使用注解 @EnableTransactionManagement 開啟事務支持后,然后在訪問數據庫的Service方法上添加注解 @Transactional 便可。
簡單例子
搭建好一個簡單的mp環境后我們在啟動類加上該注解@EnableTransactionManagement
在service層使用@Transactional
注解
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements BlogService {
@Autowired
BlogMapper blogMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean deleteBlog(Long id) {
blogMapper.deleteBlog(1L)
int i=1/0;//模擬出錯
return true;
}
}
控制類調用該方法時 可以使用trycatch
public Result delete(@PathVariable(name = "id") Long id){
// HashMap<String,Object> map=new HashMap<>();
// map.put("blog_id",id);
try{
blogService.deleteBlog(id);
return Result.succ("刪除成功");
}
catch (Exception e) {
return Result.fail("刪除失敗");
}
}
這樣就可以到達如果出錯回滾的效果