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

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

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

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

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

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

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

需要用到事物

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

 各插入两条数据:

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

开启事务:

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

 

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

提交整个事务

 

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

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

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

我们第二次再开启事务

这次要再给李四1000元

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

但张三的钱已经少了1000

 

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

答:可以!!!

张三的钱就《回滚》了

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

 开启事务

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

 

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

数据是不会变的

 

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

 

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

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

 事务的特性

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/abc23/p/9428025.html