engine 引擎就是MySQL存储数据的不同方式
myisam 插入速度快 支持全文索引
innoDB 插入速度慢 支持事务安全
假设两人同时购买火车票,两人同时看到只有一张火车票,几乎同时下单
或
在银行转账时,张三转李四500元,两边必须都完成,转账才算完成,
张三少钱和李四多钱必须一致的,这个两个操作必须同时成功或同时失败,不能一个成功,而另一个失败
需要用到事务
建立两张完全一样的表,但是引擎不一样
各插入两条数据:
mysql> insert intoa1-> values
-> ('zhangsan', 2000),->()->
->\c
mysql> insert intoa1-> values
-> ('张三', 3000),-> ('李四', 2000);
Query OK,2 rows affected (0.00sec)
Records:2 Duplicates: 0 Warnings: 0mysql> insert intoa2-> values
-> ('张三', 3000),-> ('李四', 2000);
Query OK,2 rows affected (0.07sec)
Records:2 Duplicates: 0 Warnings: 0
开启事务:
在两个窗口同时打开a2表(蓝色为第二个窗口)
当两步都完成时,这个事物才算完成
提交整个事务
在另一个窗口下可以也可以显示出结果
(之前的操作并没有任何特殊的地方,只是‘张三’转了1000给‘李四’,下面的操作才说明了
事务的一个特性【原子性】)
我们第二次再开启事务
这次要再给李四1000元
但因为网络故障,李四没收到钱,整体的转账操作,从逻辑上讲,张三白少了1000元
但张三的钱已经少了1000
那么‘张三’的钱还能不能回来呢?
答:可以!!!
张三的钱就《回滚》了
用黑色窗口和蓝色窗口来说明事务的隔离性
开启事务
在存进1000元时,如果在不按确定时,把刚存的钱取出,再按取消键,那么自己的刚存的钱是否会退出来呢
可以看出来,张三的钱并没有增加,说明了只要事务没有结束,从其他的方式询问该表,
数据是不会变的
只有当事务完成后,用其他方式访问该数据库才会显示结果
但在a1表实现刚才的操作就不会有效果(a1 engine myisam | a2 engine innodb)
可以看出,即使a1表没有停止事务,a1表增加的钱在其他窗口也能看见
事务的特性
原子性:2步或n步,要不都成功,要不都不成功
一致性:在转钱时,一个人加500, 而另一边没500块,那么这个操作就不能实现
隔离性:事务结束前,每一步带来的影响,别人都看不见
持久性:事务一旦完成,无法撤销