事务
是一组原子性的SQL查询,如果数据库引擎能够对数据库应用该组查询的全部语句,那么就执行该组查询,如果其中有一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会被执行。
事务内的语句,要么全部执行成功,要么全部执行失败。
ACID
1.原子性(atomicity)
一个事务必须被视为不可分割的最小工作单元,整个事务的所有操作,要么全部执行成功,要么全部回滚,对于一个事务来说,不可能只执行其中的一部分。
2.一致性(consistency)
数据库总是从一个一致性的状态到另一个一致性的状态,当操作发生意外情况时,因为事务没有提交,所以事务中所有的操作也不会保存到数据库中。
3.隔离性(isolation)
一个事务在做最终提交时,对其他事务是不可见的。
4.持久性(durability)
一旦事务提交,则对数据库所有的修改都会永久保存待数据库中,即使系统崩溃,修改的数据也不会丢失。
隔离性中隔离级别
1.未提交读 (READ UNCOMMITTED)
此级别中,即时事务未提交,对其他事务也都是可见的。会出现脏读的情况。实际应用中很少使用。
2.提交读(READ COMMITED)
大多数数据库的默认级别(MySQL不是)一个事务开始到提交之前,所有操作对其他事务都是不可见的,
这个级别也叫作不可重复读。两次执行一样的查询,结果可能会不一样。
3.可重复读(REPEATABLE READ)
MySQL的默认事务隔离级别。
保证了一个事务多次读取同样的记录结果是一样的。但是会出现幻读的情况,当某个事务在读取某个范围内的记录是,其他事务又在这个范围插入了新的记录,之前的事务再次读取该范围的记录时,会出现幻行。
4.可串行化(SERIALIZABLE)
强制事务串行执行,解决了幻读的问题。但是他是在每一行数据上加锁,会导致超时,锁争用的情况。所以实际很少使用。
隔离级别 -----------脏读可能性-----------不可重复读可能性-----------幻读可能性-----------加锁读
未提交读>>>>>>>>>>YES>>>>>>>>>>YES>>>>>>>>>>>>>>>>>>YES>>>>>>>>>>NO
提交读>>>>>>>>>>>>NO>>>>>>>>>>NO>>>>>>>>>>>>>>>>>>>YES>>>>>>>>>>NO
可重复读>>>>>>>>>>NO>>>>>>>>>>YES>>>>>>>>>>>>>>>>>>YES>>>>>>>>>>NO
可串行化>>>>>>>>>>NO>>>>>>>>>>YES>>>>>>>>>>>>>>>>>>YES>>>>>>>>>>YES