事务是访问数据库的一个操作序列,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后面的条件一定要检查清楚了,如果是表级锁那这样的效率就太低了。