事务隔离级别有哪些,和事务锁的理解
【mysql事务需要满足的条件】
1.原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
2.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
3.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
(事务隔离有不同级别)
4.持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
MySQL一般实现事务的步骤:
1.BEGIN 开始一个事务
2.ROLLBACK 事务回滚
3.COMMIT 事务确认
【MySQL 的事务隔离级别有哪些,具体解释是什么?分别用于解决什么问题?】
事务隔离分为不同级别:
1.读未提交(Read uncommitted)
2.读提交(read committed)
3.可重复读(repeatable read)
4.串行化(Serializable)
默认是:可重复读。
可重复读可以解决脏读、不可重复读的问题,但存在幻读的风险。
解决幻读的风险,一般用乐观锁,主要是在数据表里面加入版本控制字段来人为加入乐观锁的控制。
【MySQL幻读,乐观锁,悲观锁,死锁】
事务设计,存在幻读风险就加乐观锁,其次是加悲观锁,同时要避免死锁。
幻读进行中:https://segmentfault.com/a/1190000016566788?utm_source=tag-newest
乐观锁:在每次去拿数据的时候认为别人不会修改,不对数据上锁,但是在提交更新的时候会判断在此期间数据是否被更改,如果被更改则提交失败。乐观锁需要手动实现。
乐观锁实现:
假如先查询后操作同一条数据,有机会在过程中被其他事务处理过,产生脏数据。因此可加入版本号version字段,查询时获得版本号,进行更新时加入条件where执行版本号,如果一致就更新,同时版本号加1。
悲观锁有共享锁和排他锁。
共享锁可以用sql功能实现,用begin开启事务后,sql语句加上lock in share mode实现共享锁后,如果没有执行commit关闭事务,其他事务就无法进入数据里面操作。
排他锁和共享锁实现方式类似,只是执行的sql语句加入for update。对于Innodb引擎语句后面加上for update表示把此行数据锁定,而MyISAM则是锁定整个表。
死锁,例如事务1执行语句A和B,事务2执行语句B和A,各自执行第一个条后,各自将对方下一条数据锁定,这时候就是死锁状态。
避免死锁的产生,编写事务的时候,避免相同的组合语句不同次序执行,相同的组合语句应该同一样的次序执行。
mysql具有行锁的特性,一个事务在执行的时候,会进入锁定状态。
mysql乐观锁实现
https://blog.csdn.net/lp2388163/article/details/80683383
下一页: 索引的理解
发表回复