- 事务隔离级别
- 问题
- 样例
- 读未提交(read uncommitted)
- 读已提交(read committed)
- 可重复读(repeatable read)
- 串行化(serializable)
- 部分SQL
- 读未提交(read uncommitted): 一个事务还没提交,它的变更就能被其它事务看到
- 读已提交(read committed) 一个事务提交后,其变更才会被其他事务看到
- 可重复读(repeatable read) 一个事务执行过程中看到的数据,和该事务在启动时看到的数据一致。自然未提交的变更对其他事务也是不可见的。一个事务启动时,能够看到所有已提交的事务结果。但之后的该事务执行期间,其他事务的更新对它就不可见了
- 串行化(serializable) 对同行记录,“写”加“写锁”,“读”加“读锁”。出现读写锁冲突时,后访问的事务必须等前一个事务执行完成
- 脏读:在事务A读取了事务B中已修改但未提交的数据
- 不可重复读:当有事务A对某记录需要多次查询;而事务B在其中对该记录修改并提交,那么事务A则会出现前后读取到的数据不一致
- 幻读:当同一个查询在不同时间产生不同的行集时,所谓的幻影问题就会发生在一个事务中。 例如,如果 SELECt 执行两次,但第二次返回第一次未返回的行,则该行是“幻影”行;这里按照我的l理解不是在该事务中返回结果不一致;而是在插入时会提示已存在该记录,但是实际上是没有查出来,因此这一行是"幻影";如果两次的查询第一次返回10条第二次返回11条,这个应属于不可重复读
存在脏读、不可重复读、幻读的问题
脏读样例:
解决脏读的问题,存在不可重复读、幻读的问题
不可重复读样例:
解决脏读、不可重复读的问题,存在幻读的问题
这里说一下不可重复读:虽然在会话一中查不到会话二对中该记录的修改,但是实际上是已经修改的,因此如果是会话一在此时使用UPDATE或者DELETE则不会命中,这种情况则是幻读了;
update test set name = 3 where id = 1 and name = 1;
幻读样例:
解决脏读、不可重复读、幻读;但性能最低
串行化样例:(估计有些地方不对)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT @@tx_isolation; BEGIN; SELECT NAME FROM test WHERe id = 1; INSERT INTO test ( NAME, id ) VALUES ( '1', 1 ); COMMIT;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)