事务由一组逻辑相关的DML语句(数据库操纵语言)组成,MySQL提供一种机制使这些语句要么全部执行成功,要么全部执行失败。
一个完整的事务需要满足四个属性:
原子性、一致性、隔离性、持久性
简称ACID:
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
事务为应用层服务,不需要数据库使用者考虑很多潜在的错误和并发等问题。
MySQL使用 Innodb 引擎才支持事务 。
show engines \G --查看数据库引擎

原子性:
一个事务中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,需要回滚到事务开始前的状态。
持久性:
事务结束后,对数据的修改是永久的,即使系统故障也不影响。
隔离性:
数据库允许多个事务并发读写数据,隔离性可以防止多个事务交叉执行导致数据不一致。
一致性:
事务执行前后,数据库完整性没有被破坏。保证了前三个属性就实现了一致性,当然一致性还需要数据库使用者操作得当。
提交方式有手动提交、自动提交
InnoDB的单条sql语句会被封装成事务,受自动提交影响
查看是否自动提交

关闭自动提交:
SET AUTOCOMMIT=0;

开启自动提交:
SET AUTOCOMMIT=1;

手动提交:
输入begin或者start transaction来开启一个事务
开启后不受自动提交影响,必须通过commit提交,数据才能持久化
操作异常时候,MySQL自动回滚,可以设置回滚点手动回滚,commit后回滚无效。
设置回滚点:
savepoint 回滚点名称;
rollback to 回滚点名称;
rollback; --回滚到最开始
脏读:一个事务读到未提交的数据
幻读:一个事务读到新插入的数据
不可重复读:一个事务前后读取到的某项数据不同
读未提交【Read Uncommitted】:
所有的事务都可以看到其他事务没有提交的执行结果。
相当于没有隔离性,也会有很多并发问题,如脏读,幻读,不可重复读。
读提交【Read Committed】 :
大多数数据库的默认的隔离级别(不是 MySQL 默认的)。一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读。
可重复读【Repeatable Read】:
MySQL 默认的隔离级别,它确保同一个事务,在执行中,多次读取结果相同。但是会有幻读问题(MySQL该级别解决了幻读问题)。
串行化【Serializable】:
事务的最高隔离级别,对所有操作全部加锁,但是串行化会导致超时和锁竞争,效率很低,几乎不使用。
查看全局隔离级别:
SELECT @@global.tx_isolation;

查看当前会话隔离级别:
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;


设置当前或者全局隔离级别:
set session/global transaction isolation level 隔离级别;
总结:
隔离级别越严格 ,安全性越高,但并发性越差
MySQL 读未提交 存在脏读、幻读、不可重复读的问题,
读提交存在 幻读、 不可重复读的问题。