前言:数据库事务也是面试的时候面试官爱提问的一个方面,最近面试被问到了好几次了,于是想着整理一下。一来加深自己对相关知识的认识;二来要是以后遗忘了,能够快速回忆起来;三来希望对正在查阅相关知识点的朋友有所帮助。
一、事务的特性
①原子性:是指事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生。
eg:张三给李四转钱,要么张三的钱减少李四的增多,要么两个人的钱都不变。
②一致性:是指事务前后数据的完整性要保持一致。
eg:本来 张三有1000元 李四有1000元 一共2000。张三给李四转账100元,成功:张三900元,李四1100元 一共2000元。
③隔离性:是指是指多个用户并发访问数据库的时候,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数要相互隔离。
④持久性:是指一个事务一旦提交,他对数据库中数据的改变就是就是永久性的。
eg:张三 1000 李四 1000 张三给李四转100 张三提交了,数据回滚不了了
二、不考虑隔离性,会引发下列问题
①脏读:是指一个事务读到另一个事务未提交的数据
②不可重复读:在一个事务中,两次查询到的结果不一致(针对 update 操作)
③虚读(幻读):在一个事务中,两次查询到的结果不一致(针对 insert 操作)
三、通过设置事务隔离级别来解决读的问题
①读未提交(Read uncommitted):最低级别,上述情况都不能避免
②读已提交(Read committed):可避免 脏读 发生。Oracle默认隔离级别
③可重复读(Repeatable read):可避免 脏读、不可重复读 发生。Mysql默认隔离级别
④串行化(Serializable):可避免 脏读、不可重复读、虚读 发生