个人主页: 叶落闲庭
我的专栏:
c语言
数据结构
javaEE
操作系统
Redis
石可破也,而不可夺坚;丹可磨也,而不可夺赤。
事务是一组操作,这组操作是不可分割的最小操作单元,表示这组操作的内容要么全部执行成功,如果有一个操作没有成功,那么这组操作全部执行失败。
例如在进行转账操作时,一个账户给另一个用户转账,不管这个操作最终成功,还是因为转账失败回滚,最后这两个账户的余额相加都是一致的。
隔离性指的是有若干个并发事务,比如有两个事务,事务1和事务2都在同时操作这个数据库,事务1去操作的时候不会影响并发的事务2的执行,事物2去操作的时候也不会影响并发的事务1去执行,这两个事务是在独立的环境下运行的。
数据库当中的数据最终是存放在磁盘当中的,一个事务不管是操作成功提交了还是操作异常回滚了,最终对数据库的改变是永久的保留到磁盘中的。
有两个并发执行的事物,事务A要进行select和update操作,事务B执行select操作,它们操作的是同一个数据库,当事务A执行完update操作还没有提交时,事务B进行了select操作,这时就查出了事务A将要修改但还没有提交修改的数据,这被称为脏读。
有两个并发事务,事务A有4个操作,第一个操作是select(id=1)一个数据,事务A在进行第二个操作时,事务B对事务A第一次查询的数据进行了修改,并且提交了这次修改,接着事务A进行第三个操作,依然是select(id=1),与第一个操作一样,但这次查到的数据发生了改变,这就是不可重复读。
有两个并发事务,事务A进行了select(id=1)的操作,在提交前事务B进行了insert(id=1)的操作,并且提交完成,此时数据库当中已经有了id为1的数据,接下来事务A进行insert(id=1)的操作,此时会提示插入失败,因为事务B已经插入了id为1的数据,此时事务A再次进行select(id=1)的操作,但还是没有查到(已经解决了不可重复读的问题了),这就类似出现了幻觉,这个现象称之为幻读。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed(Oracle默认) | × | √ | √ |
Repeatable Read(MySQL默认) | × | × | √ |
Serializable | × | × | × |
SELECT @@TRANSACTION_ISOLATION;
SET SESSION TRANSACTION ISOLATION LEVEL {Read uncommitted|Read committed|Repeatable Read|Serializable } ;