说到事务,我个人理解为“将多条SQL语句操作看做为一个整体”
举例说明2分钟理解:
我向你转账,这其中包含了两个步骤。(1)从我账户上扣钱,(2)你的账户钱增加。两个步骤,其中任意一步有可能出问题
[例如:扣钱成功,增加钱的操作没有成功,程序抛异常了,数据库服务器炸了。。。]看到这里时,你应该理解了为何把SQL操作看做一个整体,如果其中任意一步出错,整个转账的过程应该是不成功的。
1.事务开始
(1)Oracle的事务开始于一个DML语句。
(2)Sql server中的事务开始 begin tran[saction]。
(3)MySQl中begin 或start transaction显式地开启一个事务。
2.SQL操作语句
3.事务结束
事务有两种结束方式:
(1)提交保存[COMMIT]
以转账举例,当扣钱和增加钱两个步骤都成功,我们可以使用提交保存,此方法就是对数据的永久修改。
(2)事务回滚[ROLLBACK]
以转账举例,当扣钱和增加钱,其中一个步骤失败,使用事务回滚,可以回滚到事务开始状态。
一致性:
下面三个特性主要是为了保证事务的一致性,这里的一致性讲的数据的前后的一致性。例如转账前后,A和B账户的余额总数不变,保持前后一致。
原子性
转账是两个步骤[扣钱和增加钱],事务则将它们看为一个过程,“过程”是不可分割的!事务具有原子性讲的就是它们不可以再分割。
隔离性
事务的隔离性是为了解决事务并发访问所造成的问题。
永久性
当提交保存之后,对数据的修改是永久性的,不可再回滚。
脏读:读取到未提交保存到的数据。
举例:
A到J店里去购买一批产品
J说:“行,先付钱”
这时A “ start transaction ”开始一个事务
A继续“ 向J账户付款100000 ”
A说“我付了 你查查”
这时“J查询账户”账户中多了100000,J发货了
A“ 事务回滚[rollback] ”
以上的例子中,A使J读取到了未提交的100000脏数据,所以这种情况称之为“脏读”