MYSQL事务

事务是访问数据库的一个操作序列,ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)

1. 脏读银行卡有100块,A在某行查看卡上余额有100,此时B在某行也在对这张卡操作,并取走了这100块,这个时候,A看到的是卡上还有100块,如果这样的话,谁开银行谁破产。
2. 不可重复读:A查卡上余额1000,此时B取出100,提交事务。A再次查询卡上只剩900,wtf 赶紧找银行查下交易记录,怎么解决?
3. 幻读


解决赃读:
*READ_COMMITED*: 读已提交,即能够读到已经提交的数据,这样就解决了银行亏钱的这个问题。

解决不可重复读:
*REPEATABLE_READ*:重复读取,就是说A这个时候在查询账户余额,后台默默加了一把锁,其它人想再操作这张卡的时候必须等到A操作完锁完全释放,这样就解决了不可重复读的这个问题啦。

 

数据库的隔离级别 (重点)
1、read uncommitted : 读未提交 :哪个问题都不能解决 
2、read committed:读已提交 :可以解决脏读 —- oracle默认的 
3、repeatable read:可重复读:可以解决脏读和不可重复读 —mysql默认的 
4、serializable:串行化:可以解决脏读不可重复读和虚读—相当于锁表 


## mysql 手动编程开启事务
BEGIN;
START TRANSACTION;
UPDATE info SET last_update = NOW() where id = 2;
ROLLBACK;
COMMIT;

看看官方是如何来定义事务,以及并发事务编程给我们带来的问题

MYSQL是如何来优雅解决的,MYSQL有行级锁、表级锁

    共享锁 也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    排它锁 又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

Innodb的锁到底锁了什么东西(面试重点)?

 通过索引上的索引项加锁来实现的,什么意思呢?就是说,当你做 delete、update、insert 的时候,如果你的where 条件不是索引项,mysql 会进行表级锁,而不是你想要的行级锁,所以以后在写SQL的时候,特别是delete 的这种语句,where后面的条件一定要检查清楚了,如果是表级锁那这样的效率就太低了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值