MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

时间:2023-03-08 21:37:33

engine 引擎就是MySQL存储数据的不同方式

myisam 插入速度快 支持全文索引

innoDB 插入速度慢 支持事务安全

假设两人同时购买火车票,两人同时看到只有一张火车票,几乎同时下单

在银行转账时,张三转李四500元,两边必须都完成,转账才算完成,

张三少钱和李四多钱必须一致的,这个两个操作必须同时成功或同时失败,不能一个成功,而另一个失败

需要用到事务

建立两张完全一样的表,但是引擎不一样

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

各插入两条数据:

mysql> insert into a1
-> values
-> ('zhangsan', 2000),
-> ()
->
-> \c
mysql> insert into a1
-> values
-> ('张三', 3000),
-> ('李四', 2000);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into a2
-> values
-> ('张三', 3000),
-> ('李四', 2000);
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

开启事务:

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

在两个窗口同时打开a2表(蓝色为第二个窗口)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

当两步都完成时,这个事物才算完成

提交整个事务

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

在另一个窗口下可以也可以显示出结果

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

(之前的操作并没有任何特殊的地方,只是‘张三’转了1000给‘李四’,下面的操作才说明了

事务的一个特性【原子性】)

我们第二次再开启事务

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

这次要再给李四1000元

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

但因为网络故障,李四没收到钱,整体的转账操作,从逻辑上讲,张三白少了1000元

但张三的钱已经少了1000

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

那么‘张三’的钱还能不能回来呢?

答:可以!!!

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

张三的钱就《回滚》了

用黑色窗口和蓝色窗口来说明事务的隔离性

开启事务

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

在存进1000元时,如果在不按确定时,把刚存的钱取出,再按取消键,那么自己的刚存的钱是否会退出来呢

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

可以看出来,张三的钱并没有增加,说明了只要事务没有结束,从其他的方式询问该表,

数据是不会变的

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

只有当事务完成后,用其他方式访问该数据库才会显示结果

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

但在a1表实现刚才的操作就不会有效果(a1 engine myisam |  a2 engine innodb)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

可以看出,即使a1表没有停止事务,a1表增加的钱在其他窗口也能看见

MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

事务的特性

原子性:2步或n步,要不都成功,要不都不成功

一致性:在转钱时,一个人加500, 而另一边没500块,那么这个操作就不能实现

隔离性:事务结束前,每一步带来的影响,别人都看不见

持久性:事务一旦完成,无法撤销