您现在的位置是:首页 >技术教程 >MySQL事务网站首页技术教程

MySQL事务

陈岂几真幸运 2023-07-23 16:04:16
简介MySQL事务

目录

概念:

ACID特性 

        事务的原子性(Atomic):

       事务的一致性(Consistency):

        事务的隔离性(Isolation):

        事务的持久性(Durability):

 事务并发存在的问题:

MySQL事务处理命令

事务的隔离级别 


概念:

         事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退 到最初的状态,因此,事务要么全部执行成功,要么全部失败。

    总结:

1. 事务是一组SQL语句的执行,要么全部成功,要么全部失败,保证事务执行的原子操作

2. 事务的所有SQL语句全部执行成功后,才能 提交(commit)事务,把结果写回磁盘上;

3. 事务执行过程中,有的SQL语句出现错误,那么事务必须要回滚到(rollback)到最初的状态。

三大块:

        begin 开始一个事务

        commit 提交一个事务

        rollback 回滚一个事务

ACID特性 

        事务的原子性(Atomic):

  事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行, 即不允许事务部分的完成。

       事务的一致性(Consistency):

一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。例如网上购物,商品出库,且要进入用户购物车;

        事务的隔离性(Isolation):

当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事务的内部的操作与其他事务的操作隔离起来,不被其他的事务所看到,使得并发执行的各个事务之间不能互相影响;

        事务的持久性(Durability):

事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为故障出 错,也应该能够恢复数据!

 ACD是由MySQL的redo log 和 undo log 保证的

I是由MySQL的锁机制来保证实现的

 事务并发存在的问题:

        (由事务的隔离性引出的问题,事务处理不经过隔离,并发的执行事务通常会发生以下问题)

        脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。事务A和事务B并发执行,事务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事务处理命令

SELECT @@AUTOCOMMIT; 查看MySQL是否自动提交事务

0表示手动提交事务,1表示自动提交事务,设置事务提交方式为手动提交方式:

mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) 

 BEGIN; 开启一个事务

 COMMIT; 提交一个事务

 ROLLBACK; 回滚一个事务到初始的位置

 SAVEPOINT point1; 设置一个名字为point1的保存点

 ROLLBACK TO point1; 事务回滚到保存点point1,而不是回滚到初始状态

 SET TX_ISOLATION='REPEATABLE-READ'; 设置事务的隔离级别 SELECT @@ TX_ISOLATION; 查询事务的隔离级别

事务的隔离级别 

实现原理: 锁 + MVCC

1、TRANSACTION_READ_UNCOMMITTED。未提交读。说明在提交前一个事务可以看到另一个事务 的变化。这样读脏数据,不可重复读和虚读都是被允许的。

2、TRANSACTION_READ_COMMITTED。已提交读。说明读取未提交的数据是不允许的。这个级别仍 然允许不可重复读和虚读产生。

3、TRANSACTION_REPEATABLE_READ。可重复读。说明事务保证能够再次读取相同的数据而不会失 败,但虚读仍然会出现。

4、TRANSACTION_SERIALIZABLE。串行化。是最高的事务级别,它防止读脏数据,不可重复读和虚读。(并发能力不行)(读写锁)

 事务隔离级别越高,为避免冲突所花费的性能也就越多。

“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别。(insert和delete可以)

  

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。