mysql:什么是事务及其特性ACID,事务的并发问题,事务的隔离级别
什么是事务?
一组逻辑操作单元,使数据从一种状态变换到另一种状态
其实一个sql也可以理解为一个事务。
多个sql也可以组成一个sql。
acid:事务的特性
-
原子性(atomicity)
原子理解为最小的工作单元,所以一个事务要么全部执行成功,要不全部失败。 -
一致性(consistency)
一致性是指事务执行前后,数据从一个 合法性状态 变换到另外一个 合法性状态 -
隔离型(isolation)
隔离性,指各个事务之间的操作互补影响,通过锁机制实现。 -
持久性(durability)
持久性,就是事务对数据的修改是可以持久化的,长期保存。
数据并发问题
-
脏写
对于两个事务 Session A、Session B,如果事务Session A 修改了 另一个 未提交 事务Session B 修改过 的数据,那就意味着发生了 脏写 -
脏读
对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效 的。 -
不可重复读
-
幻读
对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中 插入 了一些新的行。 之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。
sql中的四种隔离级别
-
READ UNCOMMITTED :读未提交
读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结
果。不能避免脏读、不可重复读、幻读。 -
READ COMMITTED :读已提交
一个事务只能看见已经提交事务所做
的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可
重复读、幻读问题仍然存在。 -
REPEATABLE READ :可重复读
可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提
交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍
然存在。这是MySQL的默认隔离级别。 -
SERIALIZABLE :可串行化
确保事务可以从一个表中读取相同的行
可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避
免脏读、不可重复读和幻读。