MYSQL-事务

特性

  • 原子性(Atomicity): 事物的一组操作是原子的,不可分割的,这组操作要么全部发生,要么都不发生。
  • 一致性(Consistency): 事务在执行前后数据的完整性保持不变。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation): 隔离性是指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图进行修改的事务看到 。
  • 持久性(Durability): 持久性是指在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。

多事务问题

  • 更新丢失: A事务和B事务在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失。
  • 脏读: 指一个事务读取了另一个事务未提交的数据
    这是非常危险的,假设A向B转账100元,对应sql如下
    1:update account set money=money+100 where name='B';
    2:update account set money=money-100 where name = 'A';
    
    当第一条sql执行完,第二条还没执行(A未提交时),如果此时B查询自己的账户,就会发现自己多了100元。如果A等B完成后在回滚,B就会损失100元。
  • 幻读: 出现幻读的情况,可能数据不是错误的,但也许不符合实际的业务需求。
    幻读出现的情况: 一个事务的两次不同时间的相同查询返回了不同的结果集。一个select语句执行了两次,但是在第二次返回了第一次没有返回的行,那么这些行就是“phantom” row。
    例如: 银行在做account表中所有用户的总金额统计报表时,此时共有三个账户,总共金额为2000元,这时候新增了一个用户账户,并存入1000元,这时候银行再次统计就会发现账户总金额为3000元,造成了幻读情况。
  • 不可重复读: 在一个事务内读取表中的某一行数据,多次读取结果不同。
    不可重复读和脏读的区别是:脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已经提交的数据。

事务隔离级别

  • 读未提交(read uncommitted): 一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交(read committed): 一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读(repeatable read): 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其它事务也是不可见的。
  • 串行化(serializable): 顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值