目录
事务定义
网上对事务比较术语化的解释是:事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。
事务例子
拿最经典的银行ATM转账来说。 A给B转账100元,流程大概为
①读取A账户余额,扣减A账户金额100,写入A账户余额
②读取B账户余额,加上转入金额100,写入B账户余额。
如果在流程①执行结束后, ATM坏了或者断电了,这样的结果就是A的账户金额变少了,但是B的账户余额却没有增加,这显然是不可接受的。所以就引入了事务以及事务的规则,这样就能保证至少在数据库层面与预期的结果是一致的。
事务规则
原子性(Atomicity)
以上文转账的例子继续说,原子性就是流程①和②是不可能再分的,要么①②同时成功,要么同时失败。
隔离性(Isolation)
上文A给B转账100元,可是A把转账分为了转账两次,每次转50(不考虑ATM是否支持)。这样整个转账流程就等于把上述①②步骤执行了两次。
T1 | T2 | |
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;