事务介绍
在MySQL
中的事务是由存储引擎
实现的,而且支持事务的存储引擎不多,我们主要讲解InnoDB存储引擎
中的事务。事务
处理可以用来维护数据
库的完整性
,保证成批的 SQL
语句要么全部执行
,要么全部不执行
。
事务用来管理DDL
、DML
、DCL
操作,比如 insert
,update
,delete
语句,默认是自动提交
的。
事务四大特性(ACID)
-
原子性
(Atomicity)一个事务
(transaction)中的所有操作
,要么全部完成
,要么全部不完成
,不会结束在中间某个环节。事务在执行过程中发生错误
,会被回滚(Rollback)
到事务开始前的状态
,就像这个事务从来没有执行过一样。 -
一致性
(Consistency)
一致性是指数据处于一种语义上的有意义且正确的状态。一致性是对数据可见性的约束
,保证在一个事务
中的多次操作
的数据中间状态对其他事务不可见的
。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。 -
隔离性
(Isolation)
数据库允许多个并发事务
同时对其数据进行读写和修改的能力,隔离性可以防止
多个事务并发执行时由于交叉执行
而导致数据的不一致
。 -
持久性
(Durability)事务
处理结束
后,对数据的修改
就是永久的
,即便系统故障也不会丢失。
事务遇到的问题
-
脏读
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 -
不可重复读
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。 -
幻读
第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样,幻读是数据行记录变多了或者少了。
简单点总结:
脏读是指读取了未提交的
记录。
不可重复读指因为被其它事务修改了记录
导致本次事务两次读取记录不一致
。
幻读是指因为其它事务
对表做了增删
导致某事务两次读取的表记录数不一致
。
事务的隔离级别
-
读未提交
(Read Uncommitted)
所有事务都可以看到没有提交事务的数据。 -
读已提交
(Read Committed)
事务成功提交后才可以被查询到,防止了脏读
问题。 -
可重复读
(Repeatable Read)
同一个事务内多次查询同一数据不受其他事务的影响,始终返回本事务开始查询的数据,防止了脏读、不可重复读
。本隔离级别是InnoDB的默认隔离级
,并且在InnoDB下本隔离级别使用Next-Key锁
还有防止幻读
的产生。 -
串行化
(Serializable)
强制串化排序执行SQL,在每个读数据行上添加共享锁。会导致大量超时现象和锁竞争。这是花费最高代价但是最可靠的事务隔离级别。防止脏读,不可重复,幻读
。