mysql事务机制

mysql中事务是很重要的机制,有了它,要么全部执行成功,要么全部失败
它是基于undo和redo两个日志文件来实现的,有了这2个文件也实现了数据库的acid属性

ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。

数据库的事务机制

事务的隔离机制很多教材中的脏读、换读、重复读等名词把人搞的很糊涂。
undo(只有执行查询语句时,mysql才会把数据放到undo中)和redo日志、开启事务、提交事务、回滚事务。mysql是从5.0开始起,支持事务机制的,从而开始在金融系统中使用。数据库中的事务都是并发执行的,但是因隔离性,会给一些业务场景带来问题。事务分为4个隔离级别:

  • read uncommitted:读取未提交数据
  • read committed:读取已提交数据
  • repeatable read:重复读取数据
  • serializable:序列化执行事务
  • START TRANSACTION; 开始事务
  • COMMIT; 结束事务
    默认情况下,mysql不允许事务之间互相读取临时数据,但是在特定场合要允许能读取一些临时数据,这就需要能修改隔离级别。
对于购票业务来说:

在这里插入图片描述
记住前提,事务默认是完全隔离的。A事务看到车票状态是未售出,于是就update该车票状态为已售出,因为没有提交事务,所以修改操作记录在redo日志中,真实数据并未改变。但此时B事务看到未售出状态,也要购买车票,并很快提交,于是状态发生改变
在这里插入图片描述
此时A事务再提交,就发现状态为已售出,于是就引发了回滚操作,虽说没有产生歧义数据,但经常购买失败会影响使用。于是允许事务读取其它事务的临时状态,就可以让B事务发现A事务购买了车票,就会选择购买其它坐席。此时就可以定义事务级别为read uncommitted SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。这是只修改会话的事务级别。会话就是在navicat中执行sql语句,当关闭面板,会话也就结束了

对于银行业务

只能让当前业务读取其它事务提交之后的数据,绝对不能读取没有提交的临时数据
在这里插入图片描述
如Scott账户有5000余额。A事务开启,但没来得及做任何操作。此时B事务有消费操作,指出100元,余额变为4900元。此时A执行操作余额变为5900元,此时没有问题。
但如果B是错误的操作,需要退回,执行rollback,所以就没有支出100元的操作。但如果允许A事务读取B事务的临时数据,按照4900去计算,得出结果5900块,此时B事务回滚也没用了,导致凭空少了100元。read committed 隔离级别能解决这个问题。

网店订单业务

在这里插入图片描述
在京东商城中,顾客下单后,支付订单前,商家将产品涨价。此时按理说,顾客应该按照涨价前的价格付款。所以希望当前事务的执行,不要受到其它事务的影响。其它事务的提交也不要影响到当前的事务。可以使用repeatable read事务。
事务执行前,会把数据拷贝到undo日志中,在repeatable read级别中,当前事务只去读取属于undo日志中属于自己的那部分数据,得到的结果是一致的,不会受到其它事务的影响

事务序列化

由于事务并发执行所带来的问题,故前三种隔离级别只适合用在某些业务场景中,但序列化的隔离性,让事务逐一执行,就不会产生上述问题。因为会影响并发,所以该事务很少使用。即一旦A事务开始,但并未结束,则B事务查询数据的时候,是没有返回的

数据的导出与导入

可以使用navicat实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值