一,事物基本介绍 1.事物概述 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。 2.操作 开启事务:start transaction; 回滚:rollback 提交:commit 二,事物的特性
原子性:事务执行过程中的任何失败都将导致事务所做的修改失效。对于数据修改,要么全部执行,要么全部不执行
一致性:当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。事务执行前后,数据状态保持一致性(例如转账,转账之后两人总金额不变)
隔离性:在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。一个事务的处理不能影响另一个事务的处理
持久性:事务处理结束,其效果在数据库中持久化。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
通俗理解,事务是一组原子操作单元,从数据库角度说,就是一组 SQL 指令。 事务是为了解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。
三.事物的隔离等级 概念:多个事物之间是隔离的,相互独立的。但是如果多个事物操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。 存在问题: 脏读:一个事物,读取到另一个事物中没有提交的数据。 不可重复读(虚度):在同一个事物中,两次读取到的数据不一样。 幻读:一个事物操作(DML)数据表中所有记录,另一个事物添加了一条数据,则第一个事物查询不到自己的修改。 隔离级别: read uncommitted: 读未提交,存在脏读、虚读、幻读 read committed: 读已提交,存在虚读、幻读 repeatable read(MySQL默认): 可重复度,存在幻读 serializable: 串行化 可以解决所有问题 注意:隔离级别从小到大安全性越来越高,但是效率越来越低。 数据库查询隔离级别:select @@tx_isolation; 数据库设置隔离级别:set global transaction isolation level 级别; 四.事物的传播行为 PROPAGATION_REQUIRED: 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这 个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS: 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY: 支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER: 以非事务方式执行,如果当前存在事务,则抛出异常。 虽然有7种,但是常用的就第一种REQUIRED和第四种REQUIRES_NEW 五.事务并发处理可能引起的问题 脏读(dirty read):一个事务读取了另一个事务尚未提交的数据 不可重复读(non-repeatable read): 一个事务的操作导致另一个事务前后两次读取到不同的数据 幻读(phantom read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同 六.不可重复度和幻读区别:
不可重复读的重点是修改,幻读的重点在于新增或者删除。
例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。