概述
1 事务的概念
一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部执行成功,要么全部失败。
事务也可以设置保存点SavePoint,当事务执行发生错误的时候,可以选择回滚到保存点。
事务的几个基本概念如下:
- 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行要的原子操作。
- 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。
- 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。
2 事务的ACID特性
每一个事务必须满足以下四个特性:
事务的原子性(Atomic):
事务是一个不可分割的整体,事务必须具有原子特性,即当数据修改时,要么全执行,要么全不执行,即不允许事务的部分完成。
事务的一致性(Consistency):
一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务!由于并发操作带来的数据不一致性包括读脏数据(脏读),不可重复读和虚读(幻读)。
事务的隔离性(Isolation):
当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,例如对任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。隔离性使得每个事务的更新在它被提交之前,对其它事务都是不可见的。
事务的持久性(Durability):
事务完成以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为故障出错,也应该能够恢复数据!
3 事务的隔离级别
事务处理不经隔离,并发执行事务时通常会发生以下的问题:
脏读(Dirty Read)(是一种错误):一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据。(事务B读取了事务A尚未提交的数据)
不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读取到不同的数据。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样。(事务B读取了事务A已提交的数据)
虚读(Phantom Read)/幻读:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)
不可重复读和幻读是正常的结果,根据项目的具体要求来设计
MySql事务的隔离级别以及满足的操作如下所示:
注意:事务的隔离级别越高,为避免冲突所花费的性能也就越多。
4 MySql的事务处理命令
SELECT @@AUTOCOMMIT; 查看MySQL是否自动提交事务
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 | # 0表示手动提交事务 1表示自动提交事务
+--------------+
1 row in set (0.01 sec)
SET AUTOCOMMIT = 0;
设置事务提交方式 0表示手动提交事务 1表示自动提交事务
- BEGIN; 开启一个事务
- COMMIT; 提交一个事务
- ROLLBACK; 回滚一个事务到初始的位置
- SAVEPOINT point1; 设置一个名字为point1的保存点
- ROLLBACK TO point1; 事务回滚到保存点point1,而不是回滚到初始状态
- SET GLOBAL TX_ISOLATION='REPEATABLE-READ'; 设置事务的隔离级别
- SELECT @@ TX_ISOLATION; 查询事务的隔离级别
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ | // MySQL默认工作在“可重复读”的隔离级别
+-----------------+
1 row in set (0.00 sec)
最后
以上就是粗心香水为你收集整理的MySql数据库事务处理1 事务的概念2 事务的ACID特性3 事务的隔离级别4 MySql的事务处理命令的全部内容,希望文章能够帮你解决MySql数据库事务处理1 事务的概念2 事务的ACID特性3 事务的隔离级别4 MySql的事务处理命令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复