什么是事物?
事物说白了就是一件事从开始发生到结束的整个过程。在MySQL里事务是一组不可被分割执行的SQL语句集合,如果有必要,可以撤销。 这样可以确保数据的一致性。rollback事物回滚,则事物执行失败,保证了数据安全。
事务和事务回滚的应用
mysql中默认sql语句会自动commit到数据库,在默认情况下MySQL开启的是autocommit模式,也就是隐含的将每条语句当做一个事务处理,每条SQL都会被自动提交。
show variables like "autocommit";
事物应用:开启事物
mysql> start transaction;
mysql>… sql命令
#此时autocommit被禁用,SQL命令不会对数据库中数据做修改
终止事物
mysql>commit;
或
mysql>rollback;
注意:事务回滚rollback只针对表记录的操作,增、删、改,对创建库、表的操作无效
案例:
建行卡转账农行卡5000
- 转账中……
- 建行-5000
- 农行+5000
- commit;转账成功
- rollback;回滚,转账失败
过程模拟
表1、CCB
create table CCB(
name varchar(20),
money int);
insert into CCB values("zhuanqian",10000);
表2、ICBC
create table ICBC(
name varchar(20),
money int);
insert into ICBC values("shouqian",10000);
开始转账
mysql> start transaction;
mysql> update CCB set money=5000 where name="zhuanqian";
mysql> update ICBC set money=...断电了;
mysql> rollback;
# select * from CCB 钱并未减少,没有执行命令
事物的性质
事务的机制通常被概括为“ACID”原则即原子性(A)、稳定性(C)、隔离性(I)和持久性(D)。
原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。
稳定性:数据库在事务执行前后状态都必须是稳定的。
隔离性:事务之间不会相互影响。
持久性:事务执行成功后必须全部写入磁盘。
事物的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
事物的隔离级别
至于事物性质实现原理,以我现水平暂不深入,以后会做深入了解
事务嵌套
当执行一个START TRANSACTION指令时,会隐式的执行一个commit操作,就是开启新事务时,自动提交原来的旧事务
所以没办法开启两个事务,只能通过savepoint来实现嵌套事务
drop table t;
create table t(a int, primary key(a));
begin;
insert into t(a) values(1);
SAVEPOINT s;
insert into t(a) values(2);
ROLLBACK to SAVEPOINT s;
commit;
因为异常,事务回滚,保存点的异常向上传播到主事务,主事务也回滚
表中没有元素