数据库事务隔离级别

数据库的事务就是保证数据的acid,原子性、一致性、隔离性、持久性,那么没有事务的话,会出现哪些问题呢?

第一部分:数据库事务存在的必要性

1、丢失更新(lost Update)

    两个事务同时都更新一行数据,但是第二个事务却中途失败退出,导致对两个修改都失效了。

2、脏读(dirty reads)

    一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但是没有及时提交,这是相当危险的,因为可能所有数据都被回滚

3、不可重复读(None-repeatable Reads)

    一个事务对同一行数据重复读取两次,但是却得到了不同的结果,同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

4、二类丢失更新(second lost updates problem)

    无法重复读的特例,有两个并发事务同时读取同一行数据,然后其中一个对他进行修改提交,而另外一个也进行修改提交,这就造成第一次写操作失败

5、幻读(phantom reads)

    事务在操作过程中出现两次查询,第二次查询结果包含了第一次查询中未出现的数据,这是因为在两次查询过程中有另外一个事务插入数据造成的。


于是为了解决问题,数据库在设计的时候就考虑到这些问题,并进行了解决。

第二部分 事务隔离级别

1、未提交读(read uncommitted)

    直译就是“读未提交”,一个更新语句没有提交,但是别的事务可以读到这个改变,这是很不安全的,允许任务读取数据库中未提交的数据更改,也称为“脏读”

2、提交读(read committed)

    直译就是“读提交的”,可以防止脏读,就是事务在执行commit以后,别的事务才能读到这个数据的更改,只能读到已经提交的数据,oracle等许多数据库都是默认该级别。该级别消除了脏读,存在不可重复读。

3、可重复读(repeatable read)

    直译就是“可重复读”,就是说在同一个事务里面先后执行同一个查询语句的时候得到的结果是一致的,同一个事务内查询都是事务开始时刻一致的。该级别消除了不可重复读但是存在幻读。

4、串行读(serializable)

    直译就是“序列化”,意思就是说这个事务执行的时候不能让别的事务并发执行,完全串行化度,每次事务都要获取表级共享锁,读写都会相互阻塞。



第三部分:数据库事务的级别的设置
mysql:
修改事务隔离级别:
      mysql> set global transaction isolation level read committed;
      mysql> set session transaction isolation level read committed;
postgres:
http://www.php100.com/manual/PostgreSQL8/sql-set-transaction.html     官方介绍
set transaction serializable   设置序列化级别,最高
set transaction read committed 设置读提交级别,level2
注意:数据库默认级别一般都是read committed级别


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值