MySQL

来源:互联网 发布:铜交易软件 编辑:程序博客网 时间:2024/05/18 01:59

【1】事务简介

事务:transaction,一系列要发生的操作;
事务安全:一种保护连续操作同时满足(实现)的一种机制;
事务安全的意义:保证数据操作的完整性;

只有InnoDB和BDB支持事务安全机制,其他不支持!!


【事务的四大特性 - ACID】

Atomic:原子性。事务的整个操作是一个整体,不可分割。要么全部成功,要么全部失败回滚。

Consistency:一致性。事务操作的前后,数据表中的数据没有变化。即,事务操作成功,刷入数据表;事务操作失败,回滚,数据表不受影响。

Isolation:隔离性。事务操作是相互隔离不受影响的。

Durability:持久性。数据一旦提交,不可改变;将会永久性的改变数据表数据。

事务操作过程中,会触发MySQL的锁机制。InnoDB默认是行锁,但是如果在事务操作过程中,没有用到索引,那么系统会自动全表检索数据,自动升级为表锁。

行锁:只有当前行被锁住,别的用户不能操作。

表锁:整个表被锁住,别的用户不能操作。


【2】事务操作

事务操作分为两种:自动事务(默认的),手动事务。

手动事务操作流程:

1.开始事务

Start transaction;

告诉系统内以下所有操作(写)不要直接写入数据库,先存放到事务日志。

2.事务操作

do something…

示例如下(张三还钱1000给李四):

Start transaction;UPDATE my_account set money = money-1000 where id = 1;select * from my_account

初始值:

这里写图片描述

还钱后:

这里写图片描述

此时李四并未收到money,断开链接(事务中断,并未commit),再次链接查询:

select * from my_account

这里写图片描述

张三账户还是1000,说明事务的有效性。

继续事务操作:

UPDATE my_account set money = money+1000 where id = 2;

如果在提交前断开链接,数据仍然不变。

3.事务关闭

选择性的将日志文件中操作的结果保存到数据表(同步)或者说直接清空事务日志(原来操作全部清空)

a) 提交事务:同步数据表(操作成功)–commit;
b) 回滚事务:直接清空日志表(操作失败)–rollback;

最终提交事务后,查看各自账户余额:

COMMIT;select * from my_account;

这里写图片描述

至此,还钱操作成功!!!


【3】事务原理

事务开启之后,所有的操作都会临时保存到事务日志里面。事务日志只有在得到commit命令才会同步到数据表,其他任何情况都会清空(rollback,断电,断开连接等等)。

这里写图片描述


【4】事务回滚点

回滚点:在某个成功的操作完成之后,后续的操作有可能成功有可能失败。但是不管成功或者失败,前面的操作都已经成功。故可以在当前成功的位置,设置一个点—可以供后续失败操作返回到该位置,而不是返回所有操作。这个点称之为回滚点。

  • 设置回滚点语法:
savepoint 回滚点名字;
  • 回到回滚点语法:
rollback to 回滚点名字;

示例如下:

--开启事务START TRANSACTION;update p_user set age = 10 where id = 1;--设置回滚点SAVEPOINT point_name;-- 假设错误操作update p_user set age = 11 where id = 1;--回滚到回滚点ROLLBACK to point_name;--关闭事务COMMIT;SELECT * from p_user where id = 1;

【5】自动事务

在MySQL中,默认的是自动事务处理,用户操作完直接同步到数据表。

自动事务:系统通过autocommit变量进行控制。

这里写图片描述


如果手动开启了事务,那么将使用手动事务(不再使用默认的自动事务)。默认自动事务为开启状态。

START  TRANSACTION;update p_user set age= 20 where id = 1;select * from p_user where id =1 ;COMMIT;

如果关闭自动事务,那么需要手动提交(commit)或回滚(rollback)。

  • 关闭自动事务语法:
set autocommit = 0/off;
  • 开启自动事务语法:
set autocommit = 1/on;

示例如下:

  • 关闭自动事务需要手动提交;
update p_user set age  = 10 where id = 1;commit;

如果同时在两个窗口更新同一条数据呢?一个开启手动事务,一个使用默认事务:

这里写图片描述

这里写图片描述

那么不好意思,后面那个将会抛出错误:

这里写图片描述

这就是MySQL的锁机制。


原创粉丝点击