[size=medium]
一、概念
事务的隔离级别:是指一个事务对数据库的修改与另一个事务之间的隔离程度。
较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
√: 可能出现 ×: 不会出现
脏读 不可重复读 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable read × × √
Serializable × × ×
两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:
1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
Read uncommitted 读未提交
强烈不推荐,不能保证数据的一致性
Read committed 读提交
这种隔离级别也是使用的非常普遍的隔离级别尤其是在5.1以后的版本中。
Repeatable read 重复读
这是采用最广的事务隔离级别,也是mysql默认的事务隔离级别。
Serializable 序列化
由于这种隔离级别的对数据高度一致的严格,所以会产生很多的锁,自然也会导致很多的死锁,对性能的影响不言而喻。
Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读
Innodb引擎是mysql server中支持事务的存储引擎之一,
自然也是支持四种事务隔离级别的
[/size]
一、概念
事务的隔离级别:是指一个事务对数据库的修改与另一个事务之间的隔离程度。
较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
√: 可能出现 ×: 不会出现
脏读 不可重复读 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable read × × √
Serializable × × ×
两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:
1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
Read uncommitted 读未提交
强烈不推荐,不能保证数据的一致性
Read committed 读提交
这种隔离级别也是使用的非常普遍的隔离级别尤其是在5.1以后的版本中。
Repeatable read 重复读
这是采用最广的事务隔离级别,也是mysql默认的事务隔离级别。
Serializable 序列化
由于这种隔离级别的对数据高度一致的严格,所以会产生很多的锁,自然也会导致很多的死锁,对性能的影响不言而喻。
Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读
Innodb引擎是mysql server中支持事务的存储引擎之一,
自然也是支持四种事务隔离级别的
[/size]