数据库事务相关概念

一 隔离级别

事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离。

1 REAE_UNCOMMITTED——不加任何锁

允许某个事务看到其他事务(该事务设置为REAE_UNCOMMITTED)并没提交的数据,不会采用任何锁。如果数据库的隔离级别为REAE_UNCOMMITTED, 则其他线程可以看到未提交的数据, 因此就出现脏读;

2 READ_COMMITTED——对操作行读不加锁,写加锁。

如果数据库隔离级别设为READ_COMMITTED,即没提交的数据别人是看不见的,数据读不加锁,但数据的写入加锁。能避免了脏读,但无法解决不可重复读和幻读。

3 REPEATABLE READ——对操作行读、写都加锁

REPEATABLE READ因为对正在操作的数据加锁,并且只有等到事务结束才放开锁, 数据读和写都加锁,当前事务如果占据了锁,其他事务必须等待本次提交完成释放,才能对相同数据操作。可以避免脏读和不可重复读,不能避免幻读。

REPEATABLE READ只能保证正在被本事务操作的数据不被其他事务修改,却无法保证有其他事务提交新的数据。 则有可能事务1在操作表T1的时候(特别是统计性的事务),其他事务仍然可以提交新数据到表T1,这样会导致线程1两次统计的结果不一致,就像发生幻觉一样。

4 SERIALIZABLE——串行化执行,一个事务完成后才能进行另外一个事务

SERIALIZABLE因为获得范围锁,且事务是一个接着一个串行执行,则保证了不会发生幻读。

由此可见,隔离级别越高,受其他事物干扰越少,并发性能越差。

二 脏读、不可重复读、幻读

脏读:事务A读到了事务B未提交的数据。

不可重复读:事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但行内容发生了变化。

幻读:事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到两行记录row1和row2。

三 数据库锁类别

数据库事务相关概念

四 参考

https://www.cnblogs.com/ubuntu1/p/8999403.html

https://www.cnblogs.com/alexlo/p/4156127.html

https://www.cnblogs.com/allenwas3/p/8344147.html

https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc