事务 mysql 视频_MYSQL进阶学习笔记九:MySQL事务的应用!(视频序号:进阶_21-22)...

知识点十:MySQL 事务的应用 (21-22)

为什么要引入事务:

为什么要引入事务这个技术呢?现在的很多软件都是多用户,多程序,多线程的。对同一表可能同时有很多人在用,为保持数据的一致性,所以提出了事务的概念。这样很抽象,举个例子:

A给B要划钱,A的账户是-1000元,B的账户是+1000元,这两个UPDATE语句必须作为一个整体来执行,不然A扣钱了,B没有加钱这种情况很难处理。

什么存储过程类型支持事务:

1.查看数据库下面支持的事务(InnoDB支持):

SHOW ENGINES;

2.查看MySQL当前默认存储引擎:

SHOW VARIABLES LIKE ‘%storage_engine%’;

3.查看某张表的存储引擎:

SHOW CREATE TABLE tbl_name;

4.对于表的存储结构的修改:

建立InnoDB表: CREATE TABLE … type=InnoDB;

修改表的存储引擎:ALTER TABLE tbl_name type=InnoDB;

如何创建事务:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 CREATE DATABASEbank;2 USEbank;3 CREATE TABLEaccount(4 aid int NOT NULL,5 accname VARCHAR(20) NOT NULL,6 accmoney DECIMAL(20,2) NOT NULL,7 PRIMARY KEY(aid)8 ) ENGINE=InnoDB DEFAULT CHARSET=gbk;9

10 INSERT INTO account VALUES(1,'A',4000),11 (2,'B',4000);

默认数据

创建事务的语法:

1. 开启事务start transaction,可以简写为 begin (注意:start transaction会造成一个隐含的UNLOCK TABLES执行)

2. 然后记录之后需要执行的一组sql

3. 提交commit

4. 如果所有的sql都执行成功,则提交,将sql的执行结果持久化到数据表内。

5. 回滚rollback

6. 如果存在失败的sql,则需要回滚,将sql的执行结果,退回到事务开始之时

7. 无论回滚还是提交,都会关闭事务!需要再次开启,才能使用。

8. 还有一点需要注意,就是事务只针对当前连接。

事务的提交:

基本原理:

提交,就会将结果持久化,不提交就不会。

如果我们不开启事务,只执行一条sql,马上就会持久化数据,可以看出,普通的执行就是立即提交。

这是因为mysql默认对sql语句的执行是自动提交的。

也就是说,开启事务,实际上就是关闭了自动提交的功能,改成了commit手动提交!

我们可以通过简单的对是否自动提交加以设置,完成开启事务的目的!

自动提交的特征是保存在服务的一个autocommit的变量内。可以进行修改:

SET autocommit=0;

说明:

可以控制的事务行为称为AUTOCOMMIT设置会话变量。

如果AUTOCOMMIT设置为1(默认值),然后每一个SQL语句(在事务与否)被认为是一个完整的事务,并承诺在默认情况下,当它完成。

AUTOCOMMIT设置为0时,发出SET AUTOCOMMIT =0命令,在随后的一系列语句的作用就像一个事务,直到一个明确的COMMIT语句时,没有活动的提交。

还需要注意一点,就是事务类似于外键约束,只被innodb引擎支持。

补充:

commit andchain:表示提交事务之后重新开启了新的事务。rollback and release:表示事务回滚之后断开和客户端的连接。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 --启动事务

2 start transaction;3 --提交事务

4 commit;5

6 --启动两个进程查看情况

7 SET autocommit=0;8 start transaction;9 UPDATE account SET accmoney=accmoney-1000 WHERE aid=1;10 UPDATE account SET accmoney=accmoney+1000 WHERE aid=2;11 COMMIT;12

13 SET autocommit=1;14 UPDATE account SET accmoney=accmoney-1000 WHERE aid=1;

事务的提交测试

事务的回滚:

回到事务发生之前的数据状态。通常rollback。

还原测试点:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 start transaction;2 UPDATE account SET accmoney=2000 WHERE aid=1;3 rollback;4

5 start transaction;6 UPDATE account SET accmoney=7000 WHERE aid=1;7 commit andchain;8

9

10 --还原点测试

11 SET autocommit=0;12 INSERT INTO account VALUES(3,'test1',5000);13 savepoint s1;14 INSERT INTO account VALUES(4,'test2',6000);15 savepoint s2;16 INSERT INTO account VALUES(5,'test3',7000);17 savepoint s3;18 --执行完三个插入语句,SELECT * FROM account可以看到这这三条数据,如果你想回滚到最初

19 --rollback就是最初什么都没有的状态。如果你想回到savepoint s1的状态(也就是插入一条test1那里)

20 --rollback to savepoint s1,同理什么都可以做.

21 rollback to savepoint s2;

事务的回滚和还原点测试

总结事务:

事务应该具有4个属性,原子性,一致性,隔离性,持久性。这四个属性通常称为ACID特性:

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么不做。

一致性(consistency):事务必须是使数据库从一个一致性状态变成另一个一致性状态。一致性与原子性使密切相关的。

隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值