事务隔离级别(transaction isolation levels):隔离级别就是对事务并发控制的四个等级。分为

1  串行化(SERIALIZABLE)

2  可重复读(REPEATABLE READ)

3  读已提交(READ COMMITED)

4  读未提交(READ UNCOMMITED):

设置隔离级别,set TRANSACTION ISOLATION LEVEL READ UNCOMMITED;

Read uncommitted:当前事务能读到其他事务未提交的数据,这种情况叫脏读。

SET TRANSATION ISOLATION LEVEL READ COMMITED;

READ COMMITTED:在当前事务过程中,不可能产生脏读。可能读到不同的数据(比如两个事务,一个事务刚刚更新一条数据,另一个事务查询的结果还是旧数据,但是一旦提交,同样的查询语句,却显示出来不同的结果),这种情况叫不可重复读。

SET TRANSATION ISOLATION LEVEL SERIALIZABLE;

SERIALIZABLE:这种隔离界别表示,在当前事务执行过程中,其他事务只能等待,事务不能并发执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

REPEATABLE READ:可重复读。

可重复读业务情景:

  张三用其智能手机的手机***端查询其招行帐户余额为300元,他准备用其中的200去抢购一个商品,在他没付款之前他的老婆取走100元,他再次查看 了一下余额,还是300元,他花了200支付了商品,在支付完后,他再次查了一下余额,竟然发现账户里一毛钱都没有啦!

在当前事务过程中,只要不执行更新操作,那么你查到的永远是同样的结果,但是一旦执行更新操作,别的事务的操作会影响到此事务。

可重复读:查询的结果是从缓存中取出,更新的操作是对数据库的更新。


读未提交数据Read Uncommitted:能查看到其它事务还未提交的数据,可能导致脏、幻、不可重复读

读已提交数据Read Committed:只能查到其它事务已提交的数据,而未提交的数据是看不到的。可防止脏读,但幻读和不可重复读仍可发生

可重复读取Repeatable Read:一个事务读取的数据在整个事务过程中,看到的一直不变,看不到其它事务对这些数据的更新,.可防止脏读,不可重复读,但幻读可能发生

序列化Serializable:同一DB上的事务只能串行执行,不能并发运行。不会发生脏读、不可重复读和幻读


mysql默认的隔离级别为Repeatable_Read

sqlserver 默认的隔离级别为Read Commited

oracle 数据库支持READ COMMITTED和SERIALIZABLE两种事务隔离性级别,不支持READ UNCOMMITTED和REPEATABLE READ这两种隔离性级别,Oracle数据库默认使用的事务隔离性级别却是READ COMMITTED


脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。

可重复读:在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读:在当前事务过程中,在两次查询之间,做了更新,就有可能产生