一、概念:
数据库事务是DBMS执行操作的逻辑单元,具有ACID四大特性:
1、Automicity(原子性):一个事务中的所有修改要么完全执行成功,要么完全不执行。
2、Consistence(一致性):在一个事务执行之前和执行之后,数据库必须处于一致性状态。如果事务提交成功,那么相关操作都必须能够正确地应用于数据库;如果事务中出现错误,那么数据库中相关的所有变化必须要能够正确地回滚,使得回到初始状态。
3、Isolation(隔离性):在并发环境中,当多个事务同时操作同一个数据时,每个事务都具有各自的独立完整的数据空间。
4、Duration(持久性):一旦事务被成功提交,那么它对数据库的更新就必须被永久保存,即便数据库遇到故障,在恢复正常运行后,依然能够保持事务成功完成时的状态。
其中隔离性理解起来比较复杂。
二、事务4个隔离级别(从低到高):
1、Read Uncommitted(读未提交):事务可读取其他事务未提交的数据。可能出现脏读的问题,即读到了别的事务回滚前的脏数据。
2、Read Committed(读提交):必须等待其他事务修改(UPDATE)提交后,事务才可读取数据。解决了脏读的问题,但是还是存在不可重复读的问题,即当事务先进行了一次数据读取,然后再次读到的数据是别的事务已经修改成功的数据,导致两次读取到的数据不一致。
3、Repeatable Read(可重复读):在开启事务时,不再允许其他事务的修改(UPDATE)操作。可以解决不可重复读的问题,但是如果其他事务有INSERT操作,则依然难以避免幻读的问题,所谓幻读就是前后读取到的数据条目不一致。
4、Serializable(序列化):所有事务串行执行。可避免脏读、不可重复读、幻读等所有问题,但对性能影响很大(尤其在较高并发场景下),一般不使用。
三、常用数据库默认的事务隔离级别
1、Oracle:Read Commited,可避免脏读,存在不可重复读和幻读的问题。
2、MySQL:Repeatable Read,可避免脏读、不可重复读,不可避免幻读的问题。
(1)查询MySQL当前会话事务隔离级别:
(2)查询MySQL全局事务隔离级别: