mysql事务概念简介
一个交易有四个特点:Atomicity,一致性,隔离性和耐久性。这四个特征也被称为酸。
1)原子性:事务是在应用程序执行的最小单位,如原子是自然界中最小的粒子,具有相同特征的非细分。交易是在最小的可执行应用逻辑。
2)一致性:事务的执行结果必须数据库从一个一致的状态变化到另一个数据库处于一致状态时,数据库只包含事务的提交成功的结果的一致性是保证原子性。
3)隔离:每个事务的执行互不干扰,和任何交易的内部操作是从其他并发事务分离。也就是说,并发执行的事务不能对其他中间状态存在,这是执行的交易不能相互作用。
4):也称为持久持久持久性,自提交服务一旦提交,对数据进行的任何更改,都应记录到永久内存中,通常存储在物理数据库中。
在关系数据库中,事务的隔离被划分为四个隔离级别,在阅读这四个层次之前引入了一些关于读取数据的概念。
1)脏读(脏读):所谓的脏读是脏数据的读取(脏数据),和脏数据是指未提交的数据。也就是说,一个事务修改的记录,在本次交易完成并提交,这个数据是在等待状态(提交,此时,也可以回滚事务)二读这篇文章未提交的数据,然后进行进一步的处理,将未提交的数据依赖性,这种现象称为脏读。
2)不重复读取不重复。一个事务一个接一个地读取相同的记录,但是两个读数据是不同的。我们称之为不可重复读,也就是说,在两个读取之间,事务被其他公司修改。
3)幻读:一个事务再次检索先前的数据按照相同的查询条件,但发现其他事务插入新数据满足查询条件。这种现象被称为魔力阅读。
事务四隔离级别:
1)未提交读(读未提交):SELECT语句是以非锁定方式执行的,因此读取脏数据是可能的,隔离级别是最低的。
2)提交读(读提交):提交的数据只能被读取,也就是说,脏读的解决方案,但未解决的不能重复。
3)可重复读(反复读):在同一事务中的查询是在事务开始时一样,在InnoDB默认级别。在SQL标准的隔离级别,消除了不重读,但仍有幻想。
4)串口读取(序列化):完整的序列化读取,所有的SELECT语句被隐式地转换为选择…锁定共享模式,即读取和使用表级共享锁,读写将相互阻塞。最高级别的隔离。
隔离级别比较表:
数据库的事务由以下语句组成:
一组DML(数据操纵语言,即,数据操作语言)将这套DML修改后保持良好的一致性。
DDL(数据定义语言,即,数据定义语言)语句。
DCL(数据控制语言、数据控制语言)语句。
DDL和DCL语句只能有最多一个,因为DDL和DCL语句导致交易须立刻。
当公司包含的所有数据库操作成功执行时,提交提交事务以使这些更改永久不变。
事务提交有两种方式:显式提交和自动提交。
(1)显式提交:使用提交。
(2)自动提交:DDL和DCL的执行,或正常退出程序。
数据库事务传递的级别指的是事务嵌套时应该采用什么策略,即在事务中调用其他事务,以及如何处理
如果有两件事:
{服务
无效的方法(){
serviceb。MethodB();
}
}
{ serviceb
无效的方法(){
}
}
1:propagation_required
添加当前正在执行的事务不在另一个事务中,因此设置了一个新事务。
例如,对serviceb.methodb交易水平定义为propagation_required,所以当servicea.methoda执行,
servicea.methoda已经完成的交易,当ServiceB.methodB被称为,和serviceb.methodb看到它运行在ServiceA.methodA
在交易中,没有新的业务。如果servicea.methoda运行时,他发现他不是一个交易,他将自己的交易。
这样,发生异常的servicea.methoda任何地方或在serviceb.methodb任何地方,并回滚事务。即使serviceb。方法的交易已
提交,但servicea.methoda将回滚在接下来的失败,和serviceb.methodb将回滚
2:propagation_supports
如果当前处于事务中,即以事务的形式运行,如果事务不再在事务中运行,则它将以非事务的形式运行。
3:propagation_mandatory
它必须在一个事务中运行,也就是说,他只能由一个父函数调用。否则,他将抛出异常。
4:propagation_requires_new
这是一点。例如,我们设计的servicea.methoda为propagation_required交易水平,和serviceb.methodb交易水平propagation_requires_new,
当执行到ServiceB.methodB,服务方法的事务将挂起。serviceb.methodb将开始一个新的交易,等待serviceb方法的交易完成。
他继续进行。他和propagation_required交易之间的区别在于对事务的回滚的程度。因为serviceb.methodb是一个新的交易,它的存在
两个不同的交易。如果serviceb.methodb已提交,然后servicea.methoda未能滚回来,和serviceb.methodb不会回滚。如果ServiceB.methodB没有回滚,
如果他抛出该异常是由servicea.methoda被俘的servicea.methoda交易仍可能被提交。
5:propagation_not_supported
交易是不支持的。例如,对servicea.methoda交易水平propagation_required,和serviceb.methodb交易水平propagation_not_supported,
当servicea.methoda执行的serviceb.methodb,servicea.methoda交易暂停,他运行在一个非交易状态,然后继续交易的交易。
6:propagation_never
在一个事务中执行不能。假设servicea.methoda交易水平propagation_required,和serviceb.methodb交易水平propagation_never,
然后serviceb.methodb会抛出。
7:propagation_nested
了解嵌套的关键是保存点。区别他和propagation_requires_new是propagation_requires_new是另一个交易,将独立于父亲的事务。
而嵌套的事务则取决于他父亲的事务,他的提交将连同他父亲的事务一起提交,也就是说,如果父亲的交易最终回滚,他也会回滚。
对嵌套事务的优势在于,他有一个保存点。