事务是什么?
事务将数据库从一种一致性状态转换为另一种一致性状态,事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成;在数据库提交事务时,可以确保要么所有修改都已经保存,要么所有修改都不保存;事务是访问并更新数据库各种数据项的一个程序执行单元。
在 MySQL innodb 下,每一条语句都是事务;可以通过 set autocommit = 0; 设置当前会话手
动提交;
事务的ACID特性
原子性(A)
事务要么提交,要么回滚
一致性(C)
一致性由业务定义,指事务从一种一致性状态转换为下一种状态时,其业务约束没有被破坏,比如唯一键仍然为唯一键。
隔离性(I)
事务的隔离指事务的执行与其他事务相互隔离,通过MVCC(多版本并发控制)和锁来实现。
持久性(D)
事务提交后,事务的操作将会被持久化而不丢失。
常见事务语句
-- 显示开启事务
START TRANSACTION | BEGIN
-- 提交事务,并使得已对数据库做的所有修改持久化
COMMIT
-- 回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
ROLLBACK
-- 创建一个保存点,一个事务可以有多个保存点
SAVEPOINT identifier
-- 删除一个保存点
RELEASE SAVEPOINT identifier
-- 事务回滚到保存点
ROLLBACK TO [SAVEPOINT] identifier
事务可能出现的并发异常
1、脏读(读未提交)
事务(A)可以读到另外一个事务(B)中未提交的数据;也就是事务A读到脏数据;
2、不可重复读(读已提交)
事务(A) 可以读到另外一个事务(B)中提交的数据;
3、幻读(REPEATABLE READ)
事务中一次读操作不能支撑接下来的业务逻辑;常发生在一个事务中一次读判断接下来写操作失
败的情况;
四种隔离级别
READ UNCOMMITTED
读未提交;该级别下读不加锁,写加排他锁,写锁在事务提交或回滚后释放锁
READ COMMITTED
读已提交;从该级别后支持 MVCC (多版本并发控制),也就是提供一致性非锁定读;此时读取操作读取历史快照数据;该隔离级别下读取历史版本的最新数据,所以读取的是已提交的数据
READ COMMITTED
可重复读;该级别下也支持 MVCC,此时读取操作读取事务开始时的版本数据;
SERIALIZABLE
可串行化;该级别下给读加了共享锁;所以事务都是串行化的执行;此时隔离级别最严苛;