spring事务和mysql的隔离级别

mysql事务、mysql隔离级别、mysql锁、mysql数据一致性、Spring事务、Spring事务传播性之间的关系 一直有些模糊,整理一下。
 
mysql事务:
在mysql中,只有使用了Innodb引擎的数据库或表才支持事务
事务处理能够用来维护数据库的完整性,保证成批的sql语句要么所有执行,要么所有不执行
事务用来管理insert,update,delete语句
事务要知足四个条件(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性:一个事务(transaction)中的全部操做,要么所有完成,要么所有不完成。
    事务在执行过程当中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务历来没有执行过同样
一致性:在事务开始前和事务结束后,数据库的完整性没有被破坏。
    这表示写入的资料必须彻底符合全部的预设规则,这包含资料的精确度、串联性以及后续数据库能够自发性的完成预约的工做。
隔离性:数据库容许多个并发事务同时对其数据进行读写和修改,隔离性能够防止多个事务并发执行时,因为交叉执行而致使数据的不一致。
    事务隔离分为不一样级别, InnoDB 存储引擎提供事务的隔离级别有:读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。
 
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会立刻执行 COMMIT 操做。所以要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
 
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级通常支持更高的并发处理,并拥有更低的系统开销。
四种隔离级别和可能产生问题:
 

Read Uncommitted:全部事务均可以看到其余未提交事务的执行结果。mysql

会致使【脏读Drity Read】:读了错误的数据。Read Uncommitted隔离级别时,b事务能够读取另外a事务未提交的数据,若是a事务rollback,则b事务读取的数据是错误的。spring

Read Committed:一个事务只能看见已经提交事务所作的改变。sql

会致使【不可重复读Non-repeatable read】:两次读的某条数据不一致。Read Committed隔离级别时,在一个事务的两次查询之间,其余事务提交并更新了该条数据,致使两次查询的数据不一致。数据库

Repeatable Read:同一个事务中屡次读取相同的数据返回的结果是同样的。MySQL的默认事务隔离级别,一个事务在执行过程当中能够看到其余事务已经提交的新插入的记录(读已经提交的,实际上是读早于本事务开始且已经提交的),可是不能看到其余事务对已有记录的更新(即晚于本事务开始的),而且,该事务不要求与其余事务是“可串行化”的。并发

在当前事务提交以前,其它不论什么事务均不可以改动或删除当前事务已读取的数据。并发性低于 READ COMMITTED。因为已读数据的共享锁在整个事务期间持有,而不是在每个语句结束时释放。测试

会致使【幻读Phantom Read】:当用户读取某范围数据行时,另外一事务在此范围内插入新行,当用户再次读取此范围数据行时,读取到新的幻影行。ui

Serializable:最高的隔离级别,它经过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每一个读的数据行上加上共享锁。在这个级别,可能致使大量的超时现象和锁竞争。spa

注意⚠️:不可重复读重点在于update和delete,而幻读的重点在于insert。命令行

重点:InnoDB引擎中Repeatable Read的实现原理。  xml

手动测试,mysql里没有出现幻读的问题。

 

 

spring事务的七种隔离级别以下:

当存在一个事务时,则支持当前事务,若是没有事务则:一、开启新事务。二、非事务执行。三、抛出异常。

老是开启一个新事务

老是非事务执行,若是当前事务存在:一、挂起该事务。二、抛出异常。

PROPAGATION_NESTED 若是活动事务存在,则运行在嵌套事务中,若是没有活动事务,则安装PROPAGATION_REQUIRED运行

相关文章
相关标签/搜索