MySQL和Spring中的事务

事务

事务指的是一个逻辑单元对数据库所做操作的一个过程。

MYSQL数据库中的事务是基于innodb存储引擎的,因为myisam存储引擎不支持事务。

 

事务(或者说该逻辑单元)的特性:ACID

1. A,也就是原子性(Atomicity)。原子的概念就是不可分割,你可以把它理解为组成物质的基本单 位,也是我们进行数据处理操作的基本单位。

2. C,就是一致性(Consistency)。一致性指的就是数据库在进行事务操作后,会由原来的一致状态,变成另一种一致的状态。也就是说当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏

3. I,就是隔离性(Isolation)。它指的是每个事务都是彼此独立的,不会受到其他事务的执行影 响。也就是说一个事务在提交之前,对其他事务都是不可见的

4. D,指的是持久性(Durability)。事务提交之后对数据的修改是持久性的,即使在系统 出故障的情况下,比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。因为当事务完 成,数据库的日志就会被更新,这时可以通过日志,让系统恢复到最后一次成功的更新状态。

注:

1.关于一致性:

任何写入数据库中的数据都需要满足我们事先定义的约束规则,比如说,在数据表中我们将姓名字段设置为主键,这时当事务进行提交或者事务发生回滚的时候,如果数据表中的姓名非唯一,就破坏了事务的一致性要求。所以说,事务操作会让数据表的状态变成另一种一致的状态

2.关于持久性:

持久性是通过事务日志来保证的。日志包括了回滚日志和重做日志。当 我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库 中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据 库系统中的重做日志,重新执行,从而使事务具有持久性。

 

事务并发处理会带来三个问题:

脏读:

一个事务读取了另一个事务没有提交的数据。

不可重复读:

一个事务内读取表中的某一行数据,多次读取结果不同。

虚读(幻读)

在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

 

注:不可重复读和幻读两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。

事务的四种隔离级别

MySQL和Spring中的事务_第1张图片

 

隔离级别越低,意味着系统吞吐量(并发程度)越大,但同时也意味着出现异常问题的可能性会更大。

 

MySQL七种传播行为

1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

3、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

4、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

5、PROPAGATION_REQUIRES_NEW:支持当前事务,创建新事务,无论当前存不存在事务,都创建新事务。

6、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

7、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

 

MySQL中开启事务

可使用 BEGIN 或 START TRANSACTION开启事务, 使用 BEGIN 或 START TRANSACTION 开启一个事务之后,自动提交将保持禁用状态,

直到使用 COMMIT 或 ROLLBACK 结束事务。之后,自动提交模式会恢复到之前的状态,

即如果 BEGIN 前 autocommit = 1,则完成本次事务后 autocommit 还是 1。

如果 BEGIN 前 autocommit = 0,则完成本次事务后 autocommit 还是 0。

具体可参考:(http://c.biancheng.net/view/7291.html)

 

Spring中的事务

Spring中的事务分为两种方式,一种是编程式事务管理,一种是声明式事务管理。

 

我们常用的就是声明式事务管理,这是基于AOP实现的事务管理。

声明式事务管理分为XML和注解两种形式。

而XML的方式和Aspect框架利用xml实现AOP时,很像。

 

AOP的XML配置是:

配置切入点。

配置切面,并在切面中配置前置后置等各种通知,并在通知中指定切入点id。

 

而事务的XML配置:

先给事务管理器配置数据源。

再编写切入点。

再编写通知。

最后在切面中将切入点和通知整合。

(具体代码可看某马出版的教材,总之很像就对了)

 

最后,基于注解配置事务不再赘述,主要想说,@Transactional注解的参数可以指定事物的隔离级别和传播级别。

传播级别有七种,和MySQL的七种传播级别相对应。

隔离级别有五种,其中一种是spring默认的隔离级别(这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别),剩余四种和数据库的隔离级别相对应。(仔细想想还是四种...)

 

你可能感兴趣的:(数据库,数据库,mysql,spring,java)