一、事务执行的特点
要么全部执行成功,要么全部执行失败
二、ACID特性
1.原子性(atomicity)
每个事务都必须被视为一个不可分割的最小工作单元,整个事务要么全部提交成功要么全部失败回滚,对于事务来说不可能也不可以只执行其中的一部分,这就称为事务的原子性。
2.一致性(consistency)
是从一个一致性的状态转换到另一个一致性的状态,确保语句之间有一致性,还是要么全部提交都保存到数据库中,要么都不保存,这就是一致性。
3.隔离性(isolation)
一个事务所执行的语句结果在最终提交之前,是对其他事务不可见的,这只是通常来说,因为MySQL的隔离性很复杂,会有隔离级别来限制,下一篇文章将会详细解释隔离级别。
4.持久性(durability)
一旦事务提交,数据将会永远保存到数据库中,这就是所谓的持久性,此时即使数据库系统崩溃也不会产生数据丢失的情况。持久性会有持久性策略来确保数据的安全保障,在后续文章中会继续解释。
三、事务的优缺点
优点
会提供更高数据安全性,比如去银行转账时,在执行完成扣光你的钱后,可是转账到目的地的时候系统却崩溃了,那么你的钱就白白损失了,如果使用事务的ACID特性,那么将会转账成功,因为保证了原子性、持久性、隔离性以及一致性。
缺点
系统会消耗额外的资源,如果使用一个非事务性的引擎,那么同样的硬件设施将会提供更强劲的性能。
四、事务的实现
实验环境搭建:
create database test;
use test;
create table list1 (id int, name char(10));
insert into list1(id,name) values(1,'成龙');
insert into list1(id,name) values(2,'李小龙');
#以上内容复制即可
mysql> select * from list1;
+------+--------+
| id | name |
+------+--------+
| 1 | 成龙 |
| 2 | 李小龙 |
+------+--------+
2 rows in set (0.00 sec)
1. 事务的关键词
- 事务(transaction):指一组sql语句
- 回退(rollback):指撤销指定sql语句的过程
- 提交(commit):指将未存储的sql语句的结果写入到数据库
- 保留点(savepoint):指事务出里中设置的临时占位符,可以对它发布回退
2. 开启事务(start transaction)
- 使用该关键词标识事务的开始
3. 回退语句(rollback)
- 定义:撤销指定sql语句,rollback只能在一个事务处理内使用,在执行一条start transaction之后
- 命令:
start transaction; --开启事务处理
delete from list1; --删除emp表中的内容
select * from list1; --emp表中内容被清空
Empty set (0.00 sec)
rollback; --对事务进行回退处理
结果:
mysql> select * from list1;--emp表中的内容再次回归
+------+--------+
| id | name |
+------+--------+
| 1 | 成龙 |
| 2 | 李小龙 |
+------+--------+
2 rows in set (0.00 sec)
4. 提交语句(commit)
- 定义:将未保存sql语句执行结果保存到数据库中,一般的sql语句都是提交和保存都是自动进行的,而事务不能自动保存,需要管理员手动明确的表示提交。
- 命令:
start transaction; --开启事务
delete from list1 where id=1; --删除
commit; --保存事务做出的结果
结果:
mysql> select * from list1; --事务提交后结果将会永久保存
+------+--------+
| id | name |
+------+--------+
| 2 | 李小龙 |
+------+--------+
1 row in set (0.00 sec)
5. 使用保留点(savepoint)
- 定义:保留点越多越好,可以创建保留点,让事务处理在合适的地方放置保留点,需要回退可以回退到某个保留点。
- 命令:
insert into list1(id,name) values(1,'成龙'); --恢复实验环境
start transaction; --开启事务
delete from list1 where id=1;; --删除id为1的那一行
savepoint delete1; --定义恢复点的名称
delete from list1 where id=2; --删除id为4的那一行
rollback to delete1; --恢复到恢复点为delete的那一点
#保留点保留的是定义保留点后的一条sql语句,而不是前一条sql语句!!!!!!
commit; --提交事务
结果:
mysql> select * from list1;
+------+--------+
| id | name |
+------+--------+
| 2 | 李小龙 |
+------+--------+
1 row in set (0.00 sec)
释放保留点:
release savepoint; --可以直接将自己保存的保留点释放
6. 更改系统默认的提交行为(autocommit)
- 定义:默认的sql语句都是自动进行提交更改的,有时我们不需要系统自动进行提交的时候,可以更改系统的默认值,但是这样修改后,每次执行语句后都必须使用commit提交事务后,语句结果才会生效。
- 命令:
set autocommit=0;
#定义为0就是标识为假了,系统不再自动提交更改,直到autocommit等于1为真
转载:https://blog.csdn.net/adsedfewf/article/details/105939678
查看评论