事务
做一个ACID数据库系统很复杂,但是用户可能并没有感觉到,凡是要做事务就必须满足这个四个特性,一个实现了ACID的数据库比没有实现的ACID的数据库更加对CPU的处理能力有更多的要求,这也正是Mysql数据库存储引擎架构发挥优势地方的地方,用户可以更加需求选择存储引擎。
事务的特性
-
原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要嘛都执行,要嘛都不执行;(就是说是一套组合拳,必须全部都来一次。要嘛就不要来。)
-
一致性:事务应确保数据库的状态,从一个一致状态到另一个一致状态。(就是事务执行完后,完整性约束没有发生改变,还是和以前一样)
例如你去取钱但是由于系统崩溃了,这个事务没有完成,那么你的账户钱不会少,因为事务没有提交,事务做的修改也不会保存到数据库
-
隔离性:就是两个事务之间互不影响
-
持久性:就是事务提交完成后,对数据库的改变是永久保存的。(增删改查操作也是持久的)
隔离级别
开场白:SQL的标准中提出了四种隔离级别
木鱼:那么这隔离级别干嘛的呢?
和尚:每一种隔离级别都规定了每个事务的修改在事务内和事务间哪些是可见的哪些是不可见的。
开场白:如下就是四种隔离级别
-
未提交的读:事务中的修改,即使没有提交,对其他事务是可见的,事务可以读取未提交的数据,这也叫脏读(实际中用少)
-
提交读(不可重复读):一个事务从开始到提交前,所做的任何修改都是不可见的,大多数数据库系统是这种,但是mysql不是
-
可重复读:解决了脏读的问题,保证了同一个事务在多次读取同样的数据记录结果是一致的,但是没有解决幻读,幻读指的就是读取某个数据时候,这个数据范围类有其他事务插入新记录。mysql默认采取的就是
-
可串行化:是最高的隔离级别,解决了幻读的问题,这种隔离界别采取的是给每一行数据都加上锁,但是这个问题会导致大量争用锁的问题,从而导致加锁读(实际中用少)
死锁
木鱼:什么是死锁呢?
和尚:死锁就是连个事务同时在一个资源上相互占用,请求锁死对方的资源
木鱼:这样会有什么后果呢?
和尚:这样就会导致事务恶性循环,产生循环依赖,导致非常慢的查询
木鱼:那有没有什么办法,解决这种情况呢?
和尚:大多数数据库系统实现了各种检测死锁超时的机制,检测超时就返回一个错 误
木鱼:会有其他的吗不会只有这一种吧?
和尚:还有一种就是检测到死锁超时后放弃锁的请求,innoDB采用的是将持有最少排他锁的事务进行回滚。