小言_互联网的博客

MySQL的事务的实现与数据库的ACID特性

479人阅读  评论(0)

一、事务执行的特点

要么全部执行成功,要么全部执行失败

二、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. 事务的关键词

  1. 事务(transaction):指一组sql语句
  2. 回退(rollback):指撤销指定sql语句的过程
  3. 提交(commit):指将未存储的sql语句的结果写入到数据库
  4. 保留点(savepoint):指事务出里中设置的临时占位符,可以对它发布回退

2. 开启事务(start transaction)

  1. 使用该关键词标识事务的开始

3. 回退语句(rollback)

  1. 定义:撤销指定sql语句,rollback只能在一个事务处理内使用,在执行一条start transaction之后
  2. 命令:
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)

  1. 定义:将未保存sql语句执行结果保存到数据库中,一般的sql语句都是提交和保存都是自动进行的,而事务不能自动保存,需要管理员手动明确的表示提交。
  2. 命令:
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)

  1. 定义:保留点越多越好,可以创建保留点,让事务处理在合适的地方放置保留点,需要回退可以回退到某个保留点。
  2. 命令:
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)

  1. 定义:默认的sql语句都是自动进行提交更改的,有时我们不需要系统自动进行提交的时候,可以更改系统的默认值,但是这样修改后,每次执行语句后都必须使用commit提交事务后,语句结果才会生效。
  2. 命令:
set autocommit=0;
#定义为0就是标识为假了,系统不再自动提交更改,直到autocommit等于1为真

转载:https://blog.csdn.net/adsedfewf/article/details/105939678
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场