理解mysql数据库的事务特征,事务隔离级别,加锁机制

<1>数据库事务的四大特性:
原子性(A):事务中包括的操作,要么全做,要么全不做,事务作为一个整体被处理,不可以被分割。
一致性(C):事务的执行结果,必须使数据库处于一致性状态,事务开始,处于一致性状态,事务结束,处于一致性状态。
隔离性(I):一个事务执行的过程中,其他事物不能干涉。并发执行的事务间互不干涉,

持久性(D):事务一旦提交,对数据库所做的修改是永久的。
<2>数据库并发操作带来的问题。
1.丢失更新:后一个事务更新的结果破坏了前一个事务更新的结果,导致前一个事务更新的结果丢失。
例子:售票时,共b=20张,a卖出去1张,剩19张,结果此时b和a同时读取出20张,卖一张剩19张卖出两张票,却只减少了2张。
2.不可重复读
a事务读取数据为x时,b事务对x-1,此时a重复读数据x,却变成了x-1与原来的数据不相同。(两个select的结果不相同)
3.读“脏数据”
事务a对数据进行了修改,事务b读取到了事务a修改后的数据,但a因为某些原因发生了回滚,此时b读到的数据就是“脏数据”。
<3>对事务并发的处理
进行封锁处理,主要过程有:1.申请加锁。2.获得锁 3.释放锁
锁类型:1.排它锁,独占锁,写锁(x锁) 2.共享锁,读锁(s锁)
排它锁:事务a对一个对象加上锁后,只允许a对其进行读,写操作,其他事物不能读,不能修改,更不能再对该对象加锁,直至事务a释放该锁
共享锁:事务a对一个对象加上共享锁后,其他事物只能再对该对象添加共享锁,不能加x锁。
<4>死锁检测的方法
1.超时法
2.等待图法(是否存在回路)

<4>事物的隔离级别
1.Read uncommitted(读取未提交的)—-引发“脏读”
2.Read Committed(读取提交了的)—–引发不可重复读。
导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit
3.Repeatable Read(可重读,mysql默认的隔离级别)—幻读。
4.Serializable(可串行化)
(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值