和数据库打交道的时候,总是会用到事务。最经典的例子就是转账,你要给朋友转100块钱,而此时你的银行卡里只有100块钱。
转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这100块钱完全可以借着这个时间差再查一次,然后再给另一个朋友转账,如果银行这么整不就乱了吗?这是就要用到“事务”这个概念了。
简单来说,事务就是要保证一组数据库操作要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。MySQL是一个支持多引擎的系统,但并不是所有的引擎都支持事务。这也是MyISAM被InnoDB取代的重要原因之一。
提到事务,就肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即事务的原子性、一致性、隔离性和永久性),这里说的是I隔离性。
当数据库上有多个事务同时执行的时候,就可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。
在谈隔离级别之前,首先要知道,隔离的越严实,效率就会越低。因此很多时候要在二者之间寻找一个平衡点。SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。
原文:https://www.cnblogs.com/xmcwm/p/14900264.html