MySql事务的隔离级别 事务属性 Spring传播行为

什么是事务?

数据库事务指的是一组数据操作,由一条或者多条SQL语句组成来操作,如果其中一条无法执行,那么所有语句都无法执行,所以事务操作要么全部成功,要么就全部失败。

事务的属性

事务有着非常严格的属性,它必须同时满足4个特性,即:原子性(Atomicity)、一致性 (Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。

事务说明

原子性:事务是一个原子操作,事务的原子性确保动作要么全部成功,要么完全不起作用。如果事务中有任何一个SQL语句执行失败,则已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。
一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,一旦事务完成被提交,那么数据和资源处于一致的状态中。
隔离性:可能有许多事物会同时处理相同数据,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事物之间要相互隔离,来防止数据破坏。
持久性:事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不会对其有任何影响。

Spring的7种传播行为

当事务被另一个事务方法调用时,必须指定事务应该如何传播。事务的传播行为可以可以由传播属性指定,Spring定义了7种类的传播行为:
REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行。
REQUIRED_NEW:当前的方法必须启动新事物,并在自己的事务内运行,如果有事务在运行,应该将它挂起。
SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则它不可以运行在事务中。
NOT_SUPPORTS:当前的方法不应该运行在事务中,如果有运行的事务,将它挂起。
MANDATORY:当前的事务必须运行在事务的内部,如果没有正在运行的事务,就抛出异常。
NEVER:当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常。
NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在自己的事务中运行。

事务的隔离级别

数据库事务的隔离级别有4种,由低到高分别为读未提交(READ UNCOMMITTED)、读提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE),并且在事务的并发操作中可能会出现脏读,不可重复读,幻读。
事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。
在这里插入图片描述
只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷。
并发事务所导致的问题(在同一个事务中出现的问题,出现的原因在于同一个数据可能同时被多个事务中的sql语句操作)可以分为以下三种类型:
脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时无效的。
不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了字段之后,T1再次读取同一个字段,值就不同了。
幻读:对于两个事务,T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入一些新的行,或者删除一些行,之后如果T1再次读取同一个表,就会多出几行。
DEFAULT:使用底层数据库隔离级别,对于大多数数据库来说,默认隔离级别是READ_COMMITTED。
READ_UNCOMMITTED:允许事务读取未被其他事务提交的变更,脏读,不可重复读和幻读的问题都会出现。因此很少用。
READ_COMMITED:已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读。
REPEATABLE_READ:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读问题依然无法解决。
SERIALIZABLE:串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了.但性能特别低下。
Oracle支持的2中事务隔离级别:READ_COMMITED,SERIALIZABLE.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值