浅谈事务(一)

简介: 关于事务,在Oracle中似乎是习以为常的,但是在学习MySQL的过程中,发现各种灵活的存储引擎,一个很大的焦点就是对于事务的支持,足以看出事务的实现还是有一定难度的,自己在学习数据库理论和Oracle的时候,对于事务的特性也都是一笔带过,ACID似乎就是书本中的概念和术语,感觉太偏向理论了,但是今天在学习看书中,也借鉴了不少宝贵的经验,重新审视来发现事务的强大和重要性。
关于事务,在Oracle中似乎是习以为常的,但是在学习MySQL的过程中,发现各种灵活的存储引擎,一个很大的焦点就是对于事务的支持,足以看出事务的实现还是有一定难度的,自己在学习数据库理论和Oracle的时候,对于事务的特性也都是一笔带过,ACID似乎就是书本中的概念和术语,感觉太偏向理论了,但是今天在学习看书中,也借鉴了不少宝贵的经验,重新审视来发现事务的强大和重要性。
好多书中都会提到的ACID,先来看看是怎么说的。
原子性:Atomicity,一致性:Consistency,隔离性:Isolation,持久性:Durability
举个例子来说明,比如使用银行卡转账,给某个朋友转账100块,就需要执行几个步骤:
首先会查看银行卡中的余额是否满足条件。
其次会从银行卡中转出100块,
然后对方的银行卡中会转入100块。
这个例子很简单也很明显,
首先原子性,就是这个转账的过程中,转账操作是一个不可再分的单元了,转账的的操作,卡1转出成功,卡2转入成功,整个过程要不全部完成,要不直接回退。
其次是一致性,就是在数据库中,事务总是从一个一致性的状态转换为另外一个一致性的状态,比如我们在操作的第2步,银行卡转出100块的瞬间,系统奔溃,电脑死机,你的账户也不会平白无故少100块钱。因为事务最终没有提交,所做的修改也不会保存在数据库中。
再次是隔离性,这个一般来说,一个事务所做的修改,对其它事务是不可见的,这一点解释起来稍微有些困难,先放一放。
最后一点是持久性,就是在数据库中,所做的事务变更最后都保存在数据库中,这一点还是从逻辑上保证的。至少在Oracle中你做了commit不会立刻写入数据文件,也是一个异步的过程。

ACID确实可以保证银行卡里不会弄丢钱,但是在逻辑层面要实现这个事务还是很困难的,从MySQL的存储引擎的发展就能看出,InnoDB存储引擎相比MyISAM来说,对于资源的消耗和性能会有一定的打折,但是相比来说就更加有优势。
其中一个难点就是隔离性,在SQL标准里面也提供了4种隔离级别,每一种级别规定了在一个事务的修改过程中,哪些在事务间是可见的,哪些是不可见的。
比如我们用sql语句来表示两个并发的事务。
 
事务1中开始查看余额,有1000块,然后向卡里转入100块。在这个过程中事务1还是没有提交,是否对于事务2可见这个1100块新余额。

如果从生活实际来考虑是不应该的。如果对于事务2可见,则这种情况下隔离级别就是未提交读( READ COMMITED),就是我们常说的脏读,当然这种隔离级别的开销是很低的,但是会导致很多问题,所以一般的在实际应用还是比较少的。
然后我们进一步思考,如果事务1在充值100块之后,在事务没有提交之前,对于事务2是完全不可见的,这种隔离级别就是不可重复读,或者提交读(READ COMMITED),Oracle中就是采用这种隔离级别的。但是在MySQL中缺默认不是这种隔离级别。
我们来看看第三种隔离级别,可重复读( REPEATABLE READ),这个级别保证了在同一个事务中多次读取同样的记录的结果是一致的。

这种情况,事务1先充值100块,这样余额就是1100,事务2充值100块,余额就是1200,但是在事务1未提交,所以再次查询的时候还是显示余额1100,这种情况就是幻读(Phantom Read)。
最后一种是最高级别,即可串行化(SERIALIZABLE),这种情况下会强制事务串行执行,可以避免幻读的问题,但是他会在读取的每一行数据上都加锁,所以可能导致大量的性能问题。这种情况下使用的场景也很少。
在Oracle中可以使用set transaction isolation level 来指定四种隔离级别。
比如未提交读,就可以运行  
> set transaction isolation level read committed;
Transaction set.

目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
事务及事务的隔离级别
事务及事务的隔离级别
|
4月前
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交
24 0
|
3月前
|
数据库
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交 查询事务默认提交方式 1=自动,0=手动 SELECT @@autocommit 修改默认提交 set@@autocommit =xx 事务的四大特征 1.原子性:是不可分割的最小操作单位,要么同时成功,要么失败 2.持久性:当事务提交或回滚后,数据库会持久化的保存数据 3.隔离性:多个事务之间。相互独立 4.一致性:事务操作前后,数据总量不变
23 4
|
3月前
事务
事务 事务的基本介绍 1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 1.开启事务:start transaction 2.回滚:rollback 3.提交:commit 自动提交和手动提交
34 0
|
2月前
|
存储 Java 中间件
事务一致性测试
事务一致性测试
9 0
|
4月前
|
SQL 前端开发 大数据
什么是大事务?以及大事务产生的问题
什么是大事务?以及大事务产生的问题
73 0
|
8月前
|
人工智能 关系型数据库 MySQL
事务详解
事务是逻辑上的一组操作,要么都执行,要么都不执行。
46 0
|
11月前
|
数据库
什么时候需要使用事务
什么时候需要使用事务
352 0
|
存储 Oracle 固态存储
深入理解事务
事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑执行单元。即事务中的所有读写是一个执行的整体,整 个事务要么成功(提交)、要么失败(中止 或者 回滚)。如果失败,应用程序可以安全地重试。
16389 0
深入理解事务
|
SQL Java 大数据
事务详解(2)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
150 1