事务指的是一个逻辑单元对数据库所做操作的一个过程。
MYSQL数据库中的事务是基于innodb存储引擎的,因为myisam存储引擎不支持事务。
1. A,也就是原子性(Atomicity)。原子的概念就是不可分割,你可以把它理解为组成物质的基本单 位,也是我们进行数据处理操作的基本单位。
2. C,就是一致性(Consistency)。一致性指的就是数据库在进行事务操作后,会由原来的一致状态,变成另一种一致的状态。也就是说当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏
3. I,就是隔离性(Isolation)。它指的是每个事务都是彼此独立的,不会受到其他事务的执行影 响。也就是说一个事务在提交之前,对其他事务都是不可见的
4. D,指的是持久性(Durability)。事务提交之后对数据的修改是持久性的,即使在系统 出故障的情况下,比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。因为当事务完 成,数据库的日志就会被更新,这时可以通过日志,让系统恢复到最后一次成功的更新状态。
注:
1.关于一致性:
任何写入数据库中的数据都需要满足我们事先定义的约束规则,比如说,在数据表中我们将姓名字段设置为主键,这时当事务进行提交或者事务发生回滚的时候,如果数据表中的姓名非唯一,就破坏了事务的一致性要求。所以说,事务操作会让数据表的状态变成另一种一致的状态。
2.关于持久性:
持久性是通过事务日志来保证的。日志包括了回滚日志和重做日志。当 我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库 中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据 库系统中的重做日志,重新执行,从而使事务具有持久性。
脏读:
一个事务读取了另一个事务没有提交的数据。
不可重复读:
一个事务内读取表中的某一行数据,多次读取结果不同。
虚读(幻读)
在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
注:不可重复读和幻读两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。
事务的四种隔离级别
隔离级别越低,意味着系统吞吐量(并发程度)越大,但同时也意味着出现异常问题的可能性会更大。
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:以非事务方式执行,如果当前存在事务,则抛出异常。
可使用 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中的事务分为两种方式,一种是编程式事务管理,一种是声明式事务管理。
我们常用的就是声明式事务管理,这是基于AOP实现的事务管理。
声明式事务管理分为XML和注解两种形式。
而XML的方式和Aspect框架利用xml实现AOP时,很像。
AOP的XML配置是:
配置切入点。
配置切面,并在切面中配置前置后置等各种通知,并在通知中指定切入点id。
而事务的XML配置:
先给事务管理器配置数据源。
再编写切入点。
再编写通知。
最后在切面中将切入点和通知整合。
(具体代码可看某马出版的教材,总之很像就对了)
最后,基于注解配置事务不再赘述,主要想说,@Transactional注解的参数可以指定事物的隔离级别和传播级别。
传播级别有七种,和MySQL的七种传播级别相对应。
隔离级别有五种,其中一种是spring默认的隔离级别(这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别),剩余四种和数据库的隔离级别相对应。(仔细想想还是四种...)