事务的隔离级别和传播方式
一、事务的四大要素
1.1 特性
1、原子性:在事务中所有的操作都是一致的,要么成功,要不不成功。
2、一致性:事务的执行使得数据库从一种正确状态转移到另一种正确的状态。事务开始和结束,数据库的完整性约束没有被破坏。
3、隔离性:在一个事务没有提交之前,其他事务不应该修改这个事务所操作的数据,没有提交的结果也不应该被其他事务读取到。
4、持久性:事务提交后的结果将保存进数据库,提交后即使数据库出现了其他故障,也应该被保存进去。
事务的作用:事务可以保证一系列的操作有序执行。保证用户的每一次操作都是可靠的,保证了后台数据的完整性。
二、事务在并发下可能出现的问题
1、脏读:指事务A读到了事务B没有提交的数据。
2、不可重复读:指某个事务两次读到的同一个数据,数据不一致的情况。
3、幻读:指在某个事务中读到了未被操作的数据。
三、事务的隔离级别
事务的隔离级别越高在并发的情况下就越安全,同时系统付出的性能代价越大。
1、default
2、read_uncommitted:读未提交,不可以防止脏读、不可重复读、幻读,一般使用较少。
3、read_committed:读已提交,可以防止脏读。不可以防止不可重读读、幻读。
4、repeatable_read:可重复读,可以防止脏读、不可重复读,不可防止幻读。读一条数据,这个事务不结束,别的事务就不可以修改这条数据。
5、串行化:可以防止脏读、幻读、不可重复读。事务串行执行,一个事务执行完了才可以执行另外一个。
mysql默认的隔离级别是repeatable_read。
四、Spring中7种事务传播类型
1、@Transactional(propagation=Propagation.REQUIRED)
required:支持当前事务,如果当前没有事务,将会新建一个事务。
2、@Transactional(propagation=Propagation.SUPPORTS)
supports:支持当前事务,如果当前没有事务,就一非事务的方式运行。
3、@Transactional(propagation=Propagation.MANDATORY)
mandatory:强制必须有事务,如果没有事务将抛出异常。
4、@Transactional(propagation=Propagation.REQUIRES_NEW)
requires_new:新建事务,如果当前存在事务,将此事务挂起。事务A的方法调用事务B的方法,事务B是requires_new,那么事务A将会被挂起,等事务B提交后才继续执行事务A。事务B失败了,则事务B回滚,事务A不会。失败后抛出的异常被事务A捕捉到后,事务A仍然可以事务提交成功。
5、@Transactional(propagation=Propagation.NOT_SUPPORTED)
not_supported:已非事务方式运行,如果当前存在事务,那么将此事务挂起。等待此方法已非事务方式执行完后,再继续执行此事务。
6、@Transactional(propagation=Propagation.NEVER)
never:不能在事务方式中运行,如果当前存在事务则抛出异常。
7、@Transactional(propagation=Propagation.PROPAGATION_NESTED)
nested:如果当前存在事务,就嵌套在事务之中运行,如果不存在和requires_new类似。
- Post Title: 事务的隔离级别和传播方式
- Post Author: HeRui
- Post Link: https://HR2812.cn/2019/03/04/transaction-level-transmission/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.