1. 什么是事务?
是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
2.事务的四大特性ACID
一个事务往往具有一下特性:
原子性(ATOMICITY):
一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。
一致性(CONSISTENCY):
一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下, 一个一致的事务将保护定义在数据上的所有完整性约束。
隔离性(ISOLATION):
在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。串行的执行一系列事务的效果应该同于并发的执行它们。这要求两件事:
在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。
两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现这个特征。
持久性(DURABILITY):
一个被完成的事务的效果应该是持久的。
3.创建事务的SQL语法
隐式事务:事务没有明显的开启或者结束的标志,在mysql中,默认是开启自动提交的
SHOW @@autocommit;

所以针对SELECT、UPDATE、DELETE、INSERT等DQL及DML语句的执行,mysql会自动提交该事务,如果关闭就需要手动提交或者回滚来完成操作。
显式事务:与隐式事务想反,有明显的开启或结束标志。
SET autocommit=0 [start transaction] # 可选的语句 [ delete | update | insert ] # DML、DQL操作 [commit | rollback]; #提交或者回滚

可以看出,在事务未提交之前,操作是有效的且更改了数据实体,那么试想一下,如果这是有多个事务参与, 肯定会出现各种各样的数据不统一的情况,这就类似多个线程在没有锁的情况下修改同一个全局变量。
4.多个事务在不同事务隔离级别下的并发问题
在mysql下事务的隔离级别有四种且由低到高依次为Read uncommitted 、Read committed 、Repeatable read (默认)、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题
1. 脏读的情况(读未提交Read uncommitted):

开启两个mysql客户端,并创建一张测试表transaction
