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的锁机制。
- Mysql
- MySql
- MYSQL
- MySQL
- mysql
- mysql
- mysql
- mysql
- Mysql
- Mysql
- mysql
- MySQL
- mysql
- Mysql
- mysql
- mysql
- mysql
- mySQL
- Codeforces Round #419 (Div. 2)
- node.js多种路由功能
- codeforces Karen and Coffee (区间贡献 思维)
- 关于thinkphp写入缓存失败的原因
- Java 8 Map sort
- MySQL
- 音视频集中营1-音频的录制
- Linux网络编程--recv函数返回值详解
- 效法曾国藩
- Lua 迭代器与泛型for
- LintCode 两数组的交Ⅱ
- java垃圾回收以及jvm参数调优概述
- FFT 9.0 IP的configure 信息进不去
- 虚拟机登陆桌面失败