数据库事务&隔离级别
1.事务:作为一个单元的一组有序的数据库操作。
#
2.数据库事务(进行事务操作)的四大特征:
<1>原子性:事务包含的操作不可分割,要么全部执行,要么全部回滚,不存在某一小部分执行成功的情况;
例如:ATM机取款的一个事务操作,你需要 插卡—输入密码—取款金额1000—吐出现金1000—卡内余额会减少1000;取款成功需要每一步全部执行完成,否则全部回滚 事务操作失败。
<2>一致性:事务执行之前和执行之后必须处于一致性状态,事务执行使得数据库从一种正确的状态转换到另一种正确的状态;因此数据库指挥保存成功提交的事务,如果数据库故障导致部分数据存储不成功 就会使数据库处于一种不一致的状态(不正确);
例如:A、B两人共有1000元,两人相互转账, 不管他们怎么转 转了多少次,到最后他们的金额合计还是1000元。
<3>隔离性:事务的执行不受其他并发事务的影响。一个事务内部操作及使用的数据对其他并发事务都是隔离的,并发执行的事务之间都是互不干扰的(事务未正确提交前,不允许把该事务对数据的任何改变提供给任何其他事务);
例如:两个 事务A上车、事务B下车 可以并发执行,两个乘客可以同时在这一站上车和下车,而不是说 一个乘客在这一站下车的话 另一个乘客就不能上车了,这两个并发事务上车和下车之间是互不干扰的;
<4>持久性:**事务提交后 结果永久性的保存到数据库,不会无缘无故的回滚;**
3.不考虑事务的隔离性
由隔离性我们可以看到多线程并发操作时,如果不考虑事务的隔离性 可能引发一下问题:
- 脏读:一个事务的处理过程读取了另一个还没有提交的事务;
- 不可重复读:一个事务范围内多次查询得到了不同的结果,因为查询间隔导致被另一个事务修改并提交 更新update 操作;
- 虚读(幻读):“当事务A要对数据表中某个字段的所有值进修改操作,此时有一个事务是插入一条记录 并提交给数据库,当提交事务A 的用户再次查看时就会发现有一行数据未被修改,其实是事务B刚刚添加进去的” 这就是幻读 插入insert操作;
4.数据库事务隔离级别
针对于以上的情况 MySql提出了四种隔离级别:
- Serializable (串行):采用锁表机制,隔离界别最高,效率最低;可避免脏读、不可重复读、幻读的发生。
- Repeatable read (可重复读):MySQL的默认级别;可避免脏读、不可重复读的发生。
- Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
<1> 这四种从1—4级别由高到低,最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低;
<2>Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,默认为Read committed级别 ;
<3>查看MySQL隔离级别:select @@tx_isolation;
<4>设置MySQL隔离级别:set @@tx_isolation;
<5>查看MySQL隔离级级别一定要在开启事务之前;
还没有评论,来说两句吧...