赞
踩
目录:
1.原子性(Atomicity):指事务内所有操作要么一起执行成功,要么都一起失败(或者说是回滚);如事务经典转账案例:A给B转账,A把钱扣了,但B没有收到;可见这种错误是不能接受的,最终会回滚,这也是原子性的重要性。
2.一致性(Consistency):指事务执行前后的状态一致,如事务经典转账案例:
A给B互相转账,不管怎么转,最终两者钱的总和还是不变。
3.持久性(Durability):事务一旦提交,数据就已经永久保存了,不能再回滚。
4.隔离性(Isolation):指多个并发事务之间的操作互不干扰,但是事务的并发可能会导致数据脏读、不可重复读、幻读问题,根据业务情况,采用事务隔离级别进行对应数据读问题处理。
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:
读未提交(READ UNCOMMITTED)
读已提交 (READ COMMITTED)
可重复读 (REPEATABLE READ)
串行化 (SERIALIZABLE)
查看默认隔离级别
show variables like '%transaction%';
select @@transaction_isolation;
修改隔离级别
- SET [GLOBAL | SESSION] TRANSACTION
- transaction_characteristic [, transaction_characteristic] ...
读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
举例:我的老板看我最近工作很辛苦准备给我发1000元奖金,但是财务不小心多按了个零,还没有来得及提交事务, 就在这个时候,我发现的工资卡多了9000元,我以为涨工资了高兴的飞起 , 财务发现不对,回滚了事务,将奖金有改回了1000元再提交。
分析:事务A读取到了事务B未提交的数据,而事务B有可能不提交该事务,
如果事务B不提交事务而是回滚则数据不会保存到磁盘上,也就意味着事务A读取到的数据有可能不存在,
所有事务A读取到事务B的是数据是脏数据,这种现象我们成称之为脏读.
结论:如果事务隔离级别运行在 Read uncommitted 级别 有 脏读 的可能性。
读已提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
举例:某已婚女子欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),就在这个时候,该已婚女子的爱人,购买了辆车,价值50万,并提交务;该已婚女子使用POS机付房款的时候发现钱不够了(第二次查询需要等待爱人支出事务提交完成)。
分析:该女子要想把房款支付就必须要等其爱人的支出事务提交后,该女子才能支付房款。
注意:如果有事务对数据进行更新(UPDATE)操作时,读取数据事务要等待这个更新操作事务提交后才能读取数据,
有效的避免脏读,但是一个事务进行了两次相同的查询而返回了不同的数据,这就是不可重复读。
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
举例:某已婚女欲购买一套新房准备迎接新生命的到来,购房款 330万 ,付款的时候查询自己账号余额 360万(第一次查询),就在这个时候,该已婚女的爱人无法从该已女男账户转出余额,接下来就可以正常付款了。
分析:重复读可以解决不可重复读问题。不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
幻读举例:
某已婚男 该月 使用拨出了 25 个电话,该已婚男爱人 查岗,
SELECT 所有 电话记录合计25条,
就在个时候 该已婚男又打了一电话,向数据库 INSERT 了一条记录并提交
可是当该已婚男的爱人打印 该已婚男 电话记录的时候 居然又26条记录
似乎出现幻觉。
Serializable 是最高的事务隔离级别,事务串行化顺序执行,
可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
注意: 大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。