数据库事务
一、什么是事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的所有更改都将被取消。就是说,事务具有有原子性,一个事务中的一系列的操作要么全部成功,要么全部失败。
二、事务的四大特性 (ACID)
1、原子性(Atomicity)
整的事务中的所有操作,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行的过程中如果发生错误,会被回滚到事务开始的状态,就像这个事务从来没有执行过一样。
2、一致性(Consistency)
在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
一致性属性保证了数据库从不返回一个未处理完的事务。
3、隔离性(Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
4、持久性(Durablity)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
三、事务的处理
1、开启事务
-- 下面两种都可以
begin;
start transaction;
2、结束事务
-- COMMIT语句是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标志一个事务的结束
COMMIT;
3、撤销事务
-- ROLLBACK语句是撤销语句,它撤销事务所做的修改,并结束当前这个事务。
rollback;
四、脏读、幻读、不可重复读
在不考虑事务的隔离控制的时候,多个事务在同一时刻对统一数据进行操作就可能影响到最终的期望结果,通常会有一下四种情况:
(1)两个更新事务同时修改一条数据,这种情况是最严重的, 程序中无论如何也不能出现这种情况,因为它会造成更新的丢失!
(2)一个更新事务更新一条数据,另一个读取事务读取了还未提交的更新,这种情况下会出现脏读
。
(3)A读取数据库,B又来修改了数据库并且提交了事务,A又来读取数据库,发现两次结果不一致,这就是不可重复读
。
(4)A读取数据库,B新添加(删除)一条数据,A又访问数据库,发现两次结果不一致,这就是幻读
。
五、事务的隔离级别(四种)
MySQL默认为REPEATABLE READ隔离级
-
读未提交(read uncommitted)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read);
-
读提交(read committed)
一个事务要等待另一个事务提交之后才能读取数据,可以避免脏读,但是不能避免不可重复读和幻读。
-
可重复读(repeatable read)
开始读取数据库事务时,不允许进行修改操作,可以避免不可重复读,但是不能避免幻读
-
序列化(serializable)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
总结:
隔离级别 | 可避免 | 不可避免 |
---|---|---|
读未提交 | 无 | 脏读、不可重复读、幻读 |
读提交 | 脏读 | 不可重复读、幻读 |
可重复读 | 脏读、不可重复读 | 幻读 |
串行化 | 脏读、不可重复读、幻读 | 无 |