-
对于同时运行的多个事务,当这些事务访问数据库相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。之后, T1再次读取同一个字段,T1再次读取同一个字段,值就不同了。
幻读:对于两个事务T1,T2,T1从一个表种读取一个字段,然后T2在该表种插入了一些新的行,如果T1再次读取同一个表,就会多出几行。
-
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会互相影响,避免各种并发问题。
-
数据库提供的4种事务隔离级别:
隔离级别 | 描述 |
---|---|
READ UNCOMMTTED(读未提交的数据) | 允许事务读取未被其他是位于提交的变更、脏读,不可重复读和幻读的问题都会出现 |
READ COMMITED(读已提交数据) | 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重读和幻读问题仍然会出现 |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可避免脏读和不可重复读,但幻读的问题仍然存在。 |
SERIALLIZABLE(串行化) | 确保事务可以从一个表种读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下。 |
-
Oracle支持2种事务隔离级别:READ UNCOMMTTED,SERIALLIZABLE。Oracle默认的事务隔离级别为:READ UNCOMMTTED
-
Mysql支持4种事务隔级别,Mysql默认事务隔离级别为:READ UNCOMMTTED
-
每启动一个mysql程序,就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务的隔离级别。
-
查看当前隔离级别:SELECT @@tx_isolation;
-
设置当前Mysql连接的隔离级别
*set transaction isolation level read committed;
-
设置数据库的全局的隔离级别:
*set global transaction isolation level read committed;