事务是什么?
事务是作为一个单元的一组有序的数据库操作,如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,如果一个操作失败,则事务回滚到操作前的状态。
事务四种特性
1、 原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
2、 一致性:事务的执行使得数据库从一种正确的状态转换成另一种正确的状态。
3、 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间没有任何干扰。
4、 持久性:事务正确提交后,其结果将永久保存在数据库中。
MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
事物隔离级别是为了解决并发出现的问题。
脏读:
事务T1正在操作一条数据,此时事务T2获取该条数据纪录,如果T1异常,事务回滚,T2读取到的数据就是脏数据,这种现象称为脏读。
解决方案:
读取数据时加上共享锁,不允许任何事务操作该数据,只能读取,读完释放。更新数据时加上排他锁,其他事务无权参与进来读写,直到事务提交后释放,这样就可以防止脏读问题。
不可重复读:
事务T1多次读取某条记录,在读取间隔中,事务T2更新了该记录的数据,当T1再次读取该记录时,获取到的数据不一致,这种现象称为不可重复读。
幻读:
事务T1批量处理多条记录,此时事务T2新增或删除了一条或多条记录,当T1处理完成,查询处理结果,会发现有记录没有处理(T2新增的)或者发现记录少了(T2删除的),会有一种幻觉的感觉,这种现象称为幻读。
读取未提交内容(Read Uncommitted):
就是一个事务读取到其他事务未提交的数据,是级别最低的隔离机制,也被称之为脏读。会产生脏读、不可重复读、幻读。
读取提交内容(Read Committed):
就是一个事务读取到其他事务提交后的数据。会产生不可重复读、幻读。
可重复读(Repeatable Read):
就是一个事务对同一份数据读取到的相同,不在乎其他事务对数据的修改。MySQL默认的隔离级别。会产生幻读。
可串行化(Serializable)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。