MySQL学习记录—什么是事务

 

目录

事务定义

事务例子

事务规则

原子性(Atomicity)

隔离性(Isolation)

一致性(Consistency)

持久性(Durability)

使用事务

默认自动开启

手动开启


事务定义

网上对事务比较术语化的解释是:事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。

事务例子

拿最经典的银行ATM转账来说。 A给B转账100元,流程大概为

①读取A账户余额,扣减A账户金额100,写入A账户余额 

②读取B账户余额,加上转入金额100,写入B账户余额。

如果在流程①执行结束后, ATM坏了或者断电了,这样的结果就是A的账户金额变少了,但是B的账户余额却没有增加,这显然是不可接受的。所以就引入了事务以及事务的规则,这样就能保证至少在数据库层面与预期的结果是一致的。

事务规则

原子性(Atomicity)

以上文转账的例子继续说,原子性就是流程①和②是不可能再分的,要么①②同时成功,要么同时失败。

隔离性(Isolation)

上文A给B转账100元,可是A把转账分为了转账两次,每次转50(不考虑ATM是否支持)。这样整个转账流程就等于把上述①②步骤执行了两次。

 T1T2
1读取A的余额 
2扣减A的50元 
3写入A的余额 
4读取B的余额 
5增加B的50元 
6写入B的余额 
7 读取A的余额
8 扣减A的50元
9 写入A的余额
10 读取B的余额
11 增加B的50元
12 写入B的余额

T1、T2分别代指流程①和流程②,上表的情况是最理想的情况,即执行完T1再执行T2。但是实际上没有事务隔离的话可能会发生执行完1后就执行7,即两次转账流程A的余额是一样的,那这样等于银行就亏了,肯定是不符合实际的。(具体的事务隔离级别会在下一篇讲)

一致性(Consistency)

一致性的含义有点隐晦,指的是复合既定约束的状态。就转账的例子来说,一致性的含义是其他事务要么看到A还没有给B转账的状态,要么A已经成功转账给B的状态,而对于A少了50元,B还没加上50元这个中间状态是不可见的。数据库某些操作的原子性和隔离性都是保证一致性的一种手段,在操作执行完成后保证符合所有既定的约束则是一种结果。

持久性(Durability)

持久性就是指的是将数据永久化保留,比如存储在硬盘中等等。

使用事务

默认自动开启

默认情况下,mysql是默认开启事务的,可用下面的语句查询,如为ON则是开启自动提交事务。

SHOW VARIABLES LIKE 'autocommit';

 所以平时用的DML语句例如 update xxx set  xxx = xxx。

手动开启

手动有两种开启方式

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> 加入事务的语句...
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> 加入事务的语句...

START TRANSACTION语句后边跟随几个修饰符,就是它们几个:

  • READ ONLY:标识当前事务是一个只读事务,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。

  • READ WRITE:标识当前事务是一个读写事务,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。

  • WITH CONSISTENT SNAPSHOT:启动一致性读。

 有开启肯定有提交,提交就是COMMIT即可

COMMIT;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值