MySQL-事务总结

什么是事务

事务:可以理解为是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即发送的一组数据命令要么执行,要么不执行。因此事务是一个不可分割的工作单位,在数据库上执行并发操作时,事务是作为最小的控制单元来使用的,特别适用于多用户同时操作的数据系统

使用

①开启事务:start transaction
②执行多条sql语句
③回滚或者提交:rollback/commit
说明:
rollback即是全部失败,commit即是全部成功

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

事物的四大特性

原子性:事务中所有操作是不可再分割的原子单位,也就是说事务中所有操作要么全部执行成功,要么全部执行失败。
注意:如果执行过程中,第一部成功了,第二步出现问题了,为了避免出现错误,往往都会进行回滚。

例子: 以银行转账为例:张三转1000元到李四账上,则这个账户的数据将都会进行更新,正常的结果是 张三的账户金额会减1000元。而李四的账号会增加1000元,可是我们知道总会有意外发生,如果因为某种原因事务在成功更新前终止了,则不会去更新这个账户的余额。并且会撤销对任何账户余额的修改。所以说要么全部执行成功,要么全部执行失败,不能不能修改。

一致性: 事务执行后,数据库状态与其他业务规则保持一致。

如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

持久性:一旦事务提交成功,事务中所有的数据库操作都必须被持久化到数据库中 ,即使提交事务后,数据库马上崩溃,在数据库重启后,也必须能保证通过某种机制恢复
注意:当事务一执行成功之后,后面无论出现什么极端的情况(事务二无论咋样),都不会对事物一造成影响

隔离性: 隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

例如:多人转账,张三和李四之间的转账与王五和赵六之间的转账,永远是相互独立。

并发能提高程序的执行效率,如果在不影响数据的正确性的情况下,我们还是希望能够尽可能多的让多个操作(事务)并发执行。
并发操作数据库可能带来的问题:
1.脏读:读到另外一个数据未更新的数据,即读到了脏读。

例如:我在写一个类Student,添加了一个属性String name。我正在写这个代码,有的人就看了我一眼屏幕,吉之岛Student中有一个String name,然后就溜了,我在提交代码之前,把name删了。此时这个同学就发生了脏读。

此时我们没有对隔离性做出任何要求,于是就产生了脏读,为了避免脏读,在写操作的时候“加锁”(这就提高了隔离性,也降低了并发性)

2.不可重复读:表示对同一记录的读取不一致,因为另一个对其进行了修改。

例如:我写了一个Student类,加了一个Student name属性,进行提交了。同学就看了我这个代码,就又溜了,之后我把Student改了,把name删除了,再次进行提交。同学跟新代码之后发现刚才的name属性不见了。

刚才对写操作加锁之后,虽然能够解决脏读的问题,但不可重复读依然存在,为了避免不可重复读,可以在“读操作“也加锁(隔离性进一步提高,并发性进一步降低)

3.幻读:表示 对同一个表两次查询不一致,因为另一事务添加一条了记录 与不可重复读很相似 都是不同时间数据不一致,只不过幻读是针对新增数据,而不可重复读是针对更改数据。

刚才给读加锁的时候,只是给“读Student“来加锁,此时我们不能在读Student的时候修改Student,但是我可以修改其他的类如Score类,当我下次提交代码的时候,同学就会发现,刚才的Score怎么不一样了。

为了解决幻读问题还得进一步提高隔离性,“串行化”。同学读代码的时候我就去休息,不做任何修改,我在写代码的时候,同学去休息,啥都不读。
并行就没有了,(完全是串行执行)隔离性是最高的,多个事务之间不会又任何影响

四大隔离级别

隔离级别读取数据一致性脏读不可重复读幻读
串行化(seralizable)最高级别,不会发生并发问题,安全,但性能低。
可重复读(Repeatable read)事务级:MySQL默认就是可重复读,性能比seralizable好。
读已提交的数据(Read Committed)语句级:oralce默认的。性能比Repeatable read好。
读未提交数据(Read uncommitted)最低级别:可能出现任何事务并发问题,性能最好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值