在mysql中只有使用了innodb数据引擎的数据库或者表才支持事务;
事务特性
- 原子性
指业务逻辑上的一组操作,这组操作中的每个单元,要么全部成功执行,要么全部执行失败; - 一致性
事务必须使数据库从一个一致性的状态变为另一个一致性的状态;例如,A向B转账,A和B账户总额为2000,则转账完成之后的总额也应该为2000; - 隔离性
在开启多个事务进行数据处理的情况下,一个事务中数据操作不应该对另一个事务中的数据操作产生影响; - 持久性
事务一旦提交,数据就应该永久保存下来;
事务的隔离级别(事务的特性中,最麻烦的一种特性就是隔离性)
如果不考虑事务的隔离性,会出现一下情况
- 脏读
一个事务读取到了另一个事务未提交的数据; - 不可重复读
一个事务读取到另一个事务已提交的update操作; - 虚读(幻读)
一个事务读取到另一个事务已提交的insert操作;
隔离级别
- READ_UNCOMMITTED(读未提交) 会出现脏读、不可重复读、幻读;
- READ_COMMITTED(读已提交) 防止脏读,会出现不可重复读、幻读;
- REPEATABLE_READ(可重复读) 防止脏读、不可重复读,会出现幻读;
- SERIALIZABLE(串行化) 防止脏读、不可重复读、虚读的发生;
注意:隔离界别越高,数据越安全,但性能越差;