数据库的事务就是保证数据的acid,原子性、一致性、隔离性、持久性,那么没有事务的话,会出现哪些问题呢?
第一部分:数据库事务存在的必要性
1、丢失更新(lost Update)
两个事务同时都更新一行数据,但是第二个事务却中途失败退出,导致对两个修改都失效了。
2、脏读(dirty reads)
一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但是没有及时提交,这是相当危险的,因为可能所有数据都被回滚
3、不可重复读(None-repeatable Reads)
一个事务对同一行数据重复读取两次,但是却得到了不同的结果,同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
4、二类丢失更新(second lost updates problem)
无法重复读的特例,有两个并发事务同时读取同一行数据,然后其中一个对他进行修改提交,而另外一个也进行修改提交,这就造成第一次写操作失败
5、幻读(phantom reads)
事务在操作过程中出现两次查询,第二次查询结果包含了第一次查询中未出现的数据,这是因为在两次查询过程中有另外一个事务插入数据造成的。
于是为了解决问题,数据库在设计的时候就考虑到这些问题,并进行了解决。
第二部分 事务隔离级别
1、未提交读(read uncommitted)
直译就是“读未提交”,一个更新语句没有提交,但是别的事务可以读到这个改变,这是很不安全的,允许任务读取数据库中未提交的数据更改,也称为“脏读”
2、提交读(read committed)
直译就是“读提交的”,可以防止脏读,就是事务在执行commit以后,别的事务才能读到这个数据的更改,只能读到已经提交的数据,oracle等许多数据库都是默认该级别。该级别消除了脏读,存在不可重复读。
3、可重复读(repeatable read)
直译就是“可重复读”,就是说在同一个事务里面先后执行同一个查询语句的时候得到的结果是一致的,同一个事务内查询都是事务开始时刻一致的。该级别消除了不可重复读但是存在幻读。
4、串行读(serializable)
直译就是“序列化”,意思就是说这个事务执行的时候不能让别的事务并发执行,完全串行化度,每次事务都要获取表级共享锁,读写都会相互阻塞。