MYSQL事务小记

136 阅读4分钟

事务:

事务就是一段sql语句的批处理,但是这个批处理是不可分割的,要么都执行 要么就回滚(rollback)都不执行

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

1. 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

2. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

3. 事务用来管理 insert,update,delete 语句

 

一般情况下 事务必须满足4个条件

原子性Atomicity:事务是应用中最小的执行单位,事务是应用中不可再分的最小逻辑执行体。

一致性Consistency:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态

隔离性Isolation:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。

持续性Durability:持续性也成为持久性,指事务一旦提交,对数据所作的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。

事务并发不进行隔离的话就容易产生脏读、幻读、不可重复读

(1) 脏读:事务A读到未提交事务B修改的数据,如果此时事务B中途执行失败回滚,那么此时事务A读取到的就是脏数据。比如事务A对money进行修改,此时事务B读取到事务A的更新结果,但是如果后面事务A回滚,那么事务B读取到的就是脏数据了。

(2) 不可重复读:同一个事务中,对同一份数据读取的结果不一致。事务A在事务B对数据更新前进行读取,然后事务B更新提交,事务A再次读取,这时候两次读取的数据不同。

(3) 幻读:可以做这样一个实验,事务A查询记录数,事务B插入一条记录(主键值为6),提交,然后事务A查询记录数,发现记录数没有改变,但是此时插入一条主键值为6的记录发现冲突了,感觉像出现了幻觉。

他们的区别:

脏读和不可重复读:脏读是事务读取了还未提交事务的更新数据。不可重复读是同一个事务中,几次读取的数据不同。

不可重复读和幻读的区别:都是在同一个事务中,前者是几次读取数据不同,后者是几次读取数据整体不同。

面对以上的问题 对应有各自的隔离级别:

image.png

在串行读的情况下 为查询加共享锁,为修改加排他锁,共享锁和共享锁能共存 排他锁和谁都不共存

 

一般的mysql数据库的默认引擎是innodb(事务,外键) 默认的隔离级别是repeatable

一般使用默认的就可以因为串行化防止一切但是效率太低

事务控制语句:

BEGIN或START TRANSACTION;显式地开启一个事务;     

COMMIT;也可以使用COMMIT WORK,不过二者是等价的。

COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;      

ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;      

SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;     

RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;     

ROLLBACK TO identifier;把事务回滚到标记点;     

SET TRANSACTION;用来设置事务的隔离级别。

InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

BEGIN 开始一个事务     

ROLLBACK 事务回滚    

COMMIT 事务确认复制代码

2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 关闭自动提交     

SET AUTOCOMMIT=1 开启自动提交

注意:如果开启事务之后 sql正常运行,如果后面没有commit,结果不会更新到数据库,我们需要手动在添加commit