数据库的事物隔离性和隔离级别

事务-事务隔离性,是被很多初学者忽略的问题,那么事务和隔离性到底是一个怎样的存在,阅读完这篇文章,提高你对事务隔离性的认识、、、

事务:

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

例如:A—>B转帐100元,对应于如下两条sql语句
  update account set money=money+100 where name=‘b’;
  update account set money=money-100 where name=‘a’;
这两条sql必须是一个整体,要么都成功,要么都失败!


Mysql中控制事务:

    mysql数据库开启事务命令:
    start transaction  开启事务
    rollback  回滚事务
    commit   提交事务

演示A->B转账100元案例(不加事务):
1、B帐户加100:update account set money = money + 100 where name = ‘b’;
2、A帐户减100:update account money = money – 100 where name = ‘a’;
结果:B帐户增加100元,A帐户没有减少100元!
加上事务:
1、开事务:start transaction;
2、B帐户加100元:update account set money = money + 100 where name = ‘b’;
3、A帐户减100元: update account money = money – 100 where name = ‘a’;
4、提交事务:commit;
结果:事务中出现错误,整体回滚


事务的四大特性(ACID)

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)
一个事务执行之前和执行之后都数据必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障(断电等)也不应该对其有任何影响。


事务的隔离性

多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离各个事务的操作,保证各个线程获取到的数据的准确性。
 如果不考虑隔离性,可能会引发如下问题:

脏读

不可重复读

虚读(幻读)



脏读:
指一个事务读取了另外一个事务未提交的数据。

这是非常危险的,假设A向B转帐100元,对应sql语句如下所示
1.update account set money=money+100 while name=‘b’;    
2.update account set money=money-100 while name=‘a’;
3.rollback;
    
两个事务并行操作,A事务中给B+100元,还未提交,B事务中查询帐户,发现多了100元。A事务进行回滚。B刚才读到的钱又丢了。
如图(1):


不可重复读:
不可重复读是指一个事务范围内多次查询却返回了不同的数据,这是由于在查询间隔,被另一个事务修改并提交了。

例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户内存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致,可能就会困惑,不知道哪次查询是准的。
如图(2):


虚读(幻读)
事务T1查询帐户金额>200的用户数量,查出来10个;此时有一个员工存入100元,提交了事务。当事务T1再查询时发现帐户金额>200元的有11个,这就是幻读。

如图(3):



 mysql已经部分解决了幻读问题

不可重复读重点在于修改,读取的某一个数据被修改了。
幻读重点在新增或删除,读取的统计值不一致。


事务隔离级别

数据库共定义了四种隔离级别来解决上述问题:

①Read uncommitted (读未提交) :最低级别,以上情况均无法保证。
②Read committed (读已提交) :可避免脏读情况发生。
③Repeatable read (可重复读) :可避免脏读、不可重复读情况的发生。
④Serializable (串行化) :可避免脏读、不可重复读、虚读情况的发生。


如图(4):

在MySQL数据库中查看当前事务的隔离级别:select @@tx_isolation;




如图(5):

在MySQL数据库中设置事务的隔离级别:set tx_isolation=’隔离级别名称;’





此生只为等你问路
而并非要为谁指路

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值