数据库中的事务,隔离级别

来源:互联网 发布:淘宝退货快递上门取件 编辑:程序博客网 时间:2024/06/15 02:57

一,事务的概念

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单元。例如,在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或者整个程序。

一般,事务具有以下四个特性(ACID):

原子性(Atomicity):要么全做,要么全不做。保证了一个事务为一个最小单元,内部不可分割。

一致性(Consistency):从一个一致性状态变到另一个一致性状态。保证事务中每个操作线程不可单独提交,若成功则一起提交,不成功则事务回滚。

隔离性(Isolation):一个事务的执行不能被其他所干扰。保证了不同事务之间看到的数据视图相互独立,相互隔离。

持久性(Durability):事务提交之后,对数据库的改变是永久的。保证事务提交之后数据会持久地保存下来。

在上述四个特性中,一致性是最基本的属性,其他三个属性都是为了保证一致性而存在的。

二,数据不一致性几种情况

脏读:一个事务读到另一个事务未提交的数据。

不可重复读:一个事务读到另一个事务已经提交的数据(update),导致查询结果不一致。

幻读:一个事务读取到另一个事务已经提交的数据(insert或者delete),从而导致查询结果不一致。

三,事务隔离级别

1.未提交读(read uncommitted):所有事务都可以看到未提交事务的执行结果,本隔离级别很少用到实际应用中,以上三种数据不一致的情况都会发生。

2.已提交读(read commited):一个事务从开始到提交之前所做的任何改变都是不可见的,直到提交为止。可以避免脏读,但是,不可重复读和幻读仍会发生。

3.可重复读(repeated read):MySQL的默认隔离级别。此隔离级别不会看到其他事务提交后的结果。可以避免不可重复读,但仍会出现幻读。

4.可串行化(serializable):最高的隔离级别,解决了幻读。该隔离级别会产生大量超时现象,一般在开发中使用的情况不多。可串行化可以通过两段锁协议来实现。事务分两个阶段,第一阶段是获得封锁,但是不能释放任何锁;第二个阶段是释放锁,在这个阶段不能再申请任何锁。


以上四个隔离级别实现过程中用到的锁:

1.未提交读:排他写锁

2.已提交读:排他写锁,共享读锁

3.可重复读:排他写锁,共享读锁

4.可串行化:仅通过行级锁无法实现事务序列化,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

原创粉丝点击