-
-
Save wings27/cc1cc572a06d065c05c1 to your computer and use it in GitHub Desktop.
mysql隔离级别及事务传播
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
TRANSACTION(事务隔离级别) | |
1. ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。 | |
每种数据库的默认隔离级别是不同的,例如SQL Server、Oracle默认Read Commited,MySQL默认Repeatable Read。 | |
另外四个与JDBC的隔离级别相对应,不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的 | |
隔离级别最高,Read Uncommited的隔离级别最低。 | |
2. ISOLATION_READ_UNCOMMITTED:读未提交数据,这是事务最低的隔离级别,在并发的事务中,它充许一个事务可以 | |
读到另一个事务未提交的更新数据。(会出现脏读,不可重复读和幻读) | |
3. ISOLATION_READ_COMMITTED:读已提交数据,保证在并发的事务中,一个事务修改的数据提交后才能被另外一个事 | |
务读取到。(会出现不可重复读和幻读) | |
4. ISOLATION_REPEATABLE_READ:可重复读,这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。一般 | |
是采用“快照”的方式来实现的。 | |
5. ISOLATION_SERIALIZABLE:事务被处理为顺序执行。这是花费最高,但也是最可靠的事务隔离级别。能有效的避免脏读、 | |
不可重复读、幻读。 | |
脏读、不可重复读、幻读的概念 | |
脏读:一个事务读取到另一事务未提交的更新新据。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有 | |
提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另 | |
外一个事务读到的这个数据是脏数据,依据脏数据所做的操作也可能是不正确的。 | |
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的 | |
更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务 | |
已提交的更新数据。 | |
幻读:事务T1执行一次查询,然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用的查询的条件。然后T1又使用相同 | |
的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然 | |
出现的一样。 | |
PROPAGATION(事务传播属性) | |
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。也就是说业务方法需要在一个事务中运行,如果 | |
业务方法被调用时,调用业务方法的行为(方法)已经处在一个事务中,那么就加入到该事务,否则为自己创建一个新的事务。 | |
(默认传播属性) | |
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。也就是说如果业务方法在某个事务范围内被调用, | |
则该方法成为该事务的一部分。如果业务方法在事务范围外被调用,则该方法在没有事务的环境下执行。 | |
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。也就是说业务方法只能在一个已经存在的事务中执行, | |
业务方法不能发起自己的事务。如果业务方法在没有事务的环境下被调用,容器就会抛出例外。 | |
PROPAGATION_REQUIRESNEW:新建事务,如果当前存在事务,把当前事务挂起。也就是说业务方法被调用时,不管是否已经存在事务, | |
业务方法总会为自己发起一个新的事务。如果调用业务方法的行为(方法)已经运行在一个事务中,则原有事务会被挂起,新的事务 | |
会被创建,直到业务方法执行结束,新事务才算结束,原先的事务才会恢复执行。 | |
PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,就把当前事务挂起。也就是说业务方法不需要事务。如果 | |
方法没有被关联到一个事务中,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后, | |
原先的事务便会恢复执行。 | |
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。也就是说业务方法绝对不能在事务范围内执行。如果业务 | |
方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。 | |
PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按REQUIRED属性执行。 | |
它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对 | |
DataSourceTransactionManager事务管理器起效。 | |
数据库事务的4个特性: | |
原子性(Atomic):组成一个事务的多个数据库操作是一个不可分割的原子单元;只有所有操作执行成功,整个事务才提交, | |
其中一个操作失败,都必须回滚到初始状态。 | |
一致性(Consistency):事务操作成功后数据库所处的状态和它的业务规则是一致的;(即数据总额不会被破坏。 | |
如A账户转账100到B账户,无论操作成功与否,A和B的存款总额是不变的) | |
隔离性(Isolation):在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰。(并非是完全无干扰, | |
根据数据库的隔离级别,会产生不同程度的干扰) | |
持久性(Durability):一旦事务提交成功,事务中的数据操作都必须持久化到数据库中;就算数据库崩溃,也必须保证有某种机制恢复。 | |
在这些特性中,数据“一致性”是最终目标,其他的特性都是为了达到这个目标的措施和手段。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment