mysql默认采用自动提交模式,也就是说,如果不是明显地开始一个事务,每个查询都会被当做一个事务执行提交操作,在当前连接中,可以通过设置AUTOCOMMIT变量来启动或者禁用自动提交模式,1表示启动
事务的特性
事务就是事务内的语句要么全部执行,要么全部执行失败 事务的一致性是指数据库总是从一个一致性的状态转移到另外一个一致性的状态 事务的隔离性是指一个事务在最终提交以前,对其他的事务是不可见的 事务的持久性是指一旦事务被提交,则其所做的修改会永久保存到数据库中
事务的隔离级别
未提交读 在未提交读级别中,事务中的修改,没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,造成脏读。 提交读 提交读是大多数数据库系统默认的隔离级别,但MySQL不是,具体是指一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,造成不可重复读 ,举例说明就是对于一个数A由50修改成100,另一个事务在A提交修改之前,读取到了A是50,刚读取完,A就被修改成了100,再次读取就变成100。 可重复读 可重复读解决了不可重复读的问题,是MVCC规定一个事务查询操作始终返回事务开始时的快照,保证两次读取的结果是一样的,无法解决幻读的问题,幻读是指当某个事务在读取某个范围内的记录时另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,InnoDB通过加间隙锁的方式解决了幻读的问题。间隙锁就是锁住了所有的行避免其他的事务改变A 中的变量。总结来说就是在可重复读的隔离级别下存在幻读的可能性,但是MySQL的InnoDB通过加间隙锁的方式解决了幻读。 可串行化 可串行化是最高的隔离级别,它通过强制事务串行执行,避免了前面说的幻读的问题,简单说就是可串行化会在每一行的数据上都加锁,所以可能导致大量的超时和锁争用的问题。