今天,作为新一年的第一篇文章,与大家分享关于MySQL事务和隔离级别的知识。在数据库管理系统中,事务是确保数据完整性和一致性的关键机制。通过事务,我们可以将多个数据库操作组合成一个逻辑单元,要么全部执行,要么全部不执行,从而确保数据的正确性和一致性。
而隔离级别则是控制多个事务并发执行时如何相互影响的关键因素。不同的隔离级别提供了不同的数据可见性和并发性能,需要根据具体的业务需求和性能要求来选择合适的隔离级别。
一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性、持久性)属性。
原子性(Atomicity)事务开始后所有操作,要么全部做完,要么全部不做不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
隔离性(Jsolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。小结:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性
总结:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性。
目录
案例:设置4种隔离级别,分析对mysql的影响。建议设置为read-committed事务级别
级别一:读未提交read-uncommitted:一个事务可以读到另一个事务未提交的结果为脏数据
级别二:读已提交read-committed:只有在事务提交后,其结果才会被其他事务看见
级别三:可重复读repeatable-read:无论事务对数据是否进行操作,事务是否提交,对于同一份数据的读取结果总是相同的。只有退出会话(事务)才能同步数据
级别四:串行化serializable:,隔离级别最高,牺牲了系统的并发性。就是锁表(不是行锁),事务修改表时并没有提交,禁止其他所有事务连接当前表
通过现象反映隔离级别效果:
四种隔离级别(MySQL默认Repeated Read,建议改为read committed):
read committed和Repeated Read在处理并发事务时的区别:
隔离级别相关参数:
mysql> show variables like '%tx_isolation%'; ---默认REPEATABLE-READ对数据不安全。建议修改为READ-COMMITTED
设置隔离级别:
mysql> set global tx isolation='READ-COMMITTED|READ-UNCOMMITTED|REPEATABLE-READ|SERIALIZABLE';
注:在会话和全局级别修改参数,都不会永久修改参数。永久修改参数只能将参数添加到my.cnf文件,然后重启生效。添加参数:transaction-isolation=READ-COMMITTED
案例:设置4种隔离级别,分析对mysql的影响。建议设置为read-committed事务级别
级别一:读未提交read-uncommitted:一个事务可以读到另一个事务未提交的结果为脏数据
级别二:读已提交read-committed:只有在事务提交后,其结果才会被其他事务看见
级别三:可重复读repeatable-read:无论事务对数据是否进行操作,事务是否提交,对于同一份数据的读取结果总是相同的。只有退出会话(事务)才能同步数据
级别四:串行化serializable:,隔离级别最高,牺牲了系统的并发性。就是锁表(不是行锁),事务修改表时并没有提交,禁止其他所有事务连接当前表
好啦今天的内容结束了,希望这边文章可以让大家对事务和隔离级别有所了解。