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("删除失败");
}
}
这样就可以到达如果出错回滚的效果