图片 17

mysql事务

一、事物的介绍
①一个或者一组SQL语句组成一个执行的单元,这个单元要么全部执行(commit),要么全部不执行(rollback),可以理解为一个最小的不可分割的单元,主要保证数据的一致性。
②在MySQL中只有Innodb数据库引擎支持事物。
③只有DML语句才有事物,主要有(insert、update、delete)。
二、事物的分类
①扁平事物
最简单的事物,使用最多的事物,由BEGIN WORK开始,由COMMIT WORK 或者
ROLLBACK
WORK结束,之间的操作都是原子性的,要么全部执行,要么全部回滚。
②带保存点的事物
基于扁平事物之上的,允许在事物执行过程中回滚到事物中较早的一个状态。
③链事物
保存点事物的一个变种,保存点事物在系统宕机时候,所有的保存点是易丢失的,当系统重新恢复的时候,事物需要重新开始执行,不能从最近的保存点断点执行。链事物是指在提交事物的时候,释放不需要的数据对象,将必要的处理上下文的隐式的传给下一个要开始的事物,提交事物和开启下一个事物合并为一个原子操作,像一个事物在执行。链事物的回滚只针对于当前的保存点,带保存点的事物能回滚到任意正确的保存点。
④嵌套事物
嵌套事物是一个层次的结构框架,一个顶层的事物控制着各个层次的事物,顶层之下嵌套的事物称为子事物,父事物回滚,子事物也会跟着回滚,子事物具体ACI属性,不具有D的特性。
⑤分布式事物
分布式事物是在分布式环境下运行的扁平事物。
注:Mysql 的innodb数据库引擎,不支持嵌套事物,其余均支持。
三、事物的特性(ACID)
①原子性(Atomicity)
一个事物中的所有操作,要么全部完成,要么全部不完成,不会结束在某个环节。事物在执行的过程中发生的错误,会被回滚到事物开始前的状态,就像整个事物从来没有执行过一样。
②一致性(Consistency)
一致性是指事务将数据库从一种状态转变为另一种状态,在事物开始之前和事物结束之后,数据库的完整性没有被破坏。
③隔离性(Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
④持久性(Durability)
事物处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。
四、事物的创建
1.隐式事物和显式事物
隐式事物:事物没有明显的开始结束标志,类似于insert、update、delet语句。
显式事物:事物具有明显的开始或者结束标志
因为mysql的innodb数据库引擎的事物默认是开启状态,显式事物的开启的前提是将自动提交功能设置为禁用。
2.事物控制语句
①start transaction | begin:显式的开启事物。前提将autocommit关闭。
②commit:提交事物,只要执行正确的指令,对数据的修改是永久性。
③rollback:取消所有事物,并撤销正在进行的所有未提交的修改。
④savepoint spname:在事物中创建保存点。
⑤release savepoint spname:删除事物的保存点。
⑥rollback to
spname:把事物回滚到标记点,回滚点事前的事物成功,之后的回滚。
⑦ select @@autocommit:查询事物是自动提交状态
show variables like “autocommit”;
⑧set autocommit = 0:禁用自动提交
set autocommit = 1:开启自动提交
⑨查看隔离级别
select @@tx_isolation;
⑩设置隔离级别
set global | session transaction isolation level 隔离级别;
3.演示事物
准备数据
图片 1
案例1:沉醉向花花转账20元
图片 2
案例2:沉醉向花花转账100,系统突然出错
图片 3
案例3:事物演示delete 和 truncate
delet支持事物,truncate不支持事物
图片 4
图片 5
案例4:savepoint的演示
图片 6
五、并发事物问题和事物的隔离级别
1.并发事物处理带来的问题
①脏读
一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。
事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。
②不可重复读
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。
事务A读取到了事务B已经提交的修改数据,不符合隔离性
③幻读
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
事务A读取到了事务B体提交的新增数据,不符合隔离性。
注意:
脏读是事务B里面修改了数据。
幻读是事务B里面新增了数据。
2.事物隔离级别
①read
uncommitted(读未提交):事物的修改,即使没有提交,对其他事物也是可见的。事物读未提交的数据成为脏读。
②read
committed(读以提交):一个事物在提交之前,所做的任何修改对其他事物都是不看见,但是对其他事物称为不可重复读,因为两次查询的结果可能不一样。
③repeatable
read(可重复读):该级别解决了脏读、不可重复读的问题,保证了在一个事物中多次读到的数据是一致的,但是没有解决幻读的问题。
④serializable(串行化):会在读取每行数据的时候加锁,避免了幻读的问题。
3.事物隔离级别演示
①读未提交
图片 7
②读已提交 但是不能避免重复读
图片 8
如果左边提交了,右面会读到两次不一样的数据
图片 9
③可重复读
图片 10
图片 11
没有避免幻读
图片 12
④串行化
图片 13
图片 14
阻塞状态,一方提交另一方才能进行下一步操作,可以避免幻读,但是处理高并发效率较低,mysql默认为第三级别。
图片 15
数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上
“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

 

一、介绍

什么是事务

  mysql支持几种基本的数据库引擎,其中MYSQL的两种最基本的引擎MyISAM和InnoDB,其中只有InnoDB支持事务管理。


  事务处理:可以用来维护数据库的完整性,他保证成批的MySQL操作要么完全执行,要么不完全执行。

 

  事务处理是一种机制,用来管理必须成批执行的MYSQL操作,以保证数据库不包含不完整的操作结果。

一系列有序的数据库操作:

 

  • 要么全部成功
  • 要么全部回退到操作前状态
  • 中间状态对其他连接不可见

二、事务的几个基本术语

 

  事务(transaction):指一组SQL语句

事务的基本操作

  回退(rollback):指撤销指定SQL语句的过程

 

  提交(commit):指将未存储的SQL语句结果写入数据库表。

基本操作 说明
start transaction; 开始事务
commit; 提交(全部完成)
rollback; 回滚(回到初始状态)

  保留点(savepoint):指事务处理中设置的临时占位符,你可以对它发布回退(与回退整个事务处理不同)

 

 

图片 16.png)

三、控制事务处理

 

  事务开始:

 

    start transaction;

 

  1、使用ROLLBACK:MySQL用这个命令来回退(撤销)MySQL语句:

 

    select * from ordertotal;

 

    start transaction;

图片 17

    delete from transaction;

 

    select * from ordertotals;

图中便是数据库中的事务操作;及
开始事务–>SQL操作–>commit/rollback;

    rollbaclk;

savepoint,保存点,在事务回滚时,可以回滚到保存点;

    select * from ordertotals;

而提交只能全部提交不能仅提交保存点;

    虽然已经删除数据,但是我们在提交之前使用了rollback,那么在进行查询的时候,已经删除了的数据又恢复了。

 

    rollback只能在一个事务处理内使用,事务处理用来管理insert,update和delete语句,而select,create,drop等都不能使用事务管理。

savepoint  savepoint_name;
rollback to savepoint_name;
commit;

  

事务开始也可以用 begin;或者 start transaction;

    2、使用commit:在事务处理中,提交并不会隐含的进行,为进行明确的提交,使用commit语句。

 

      start transaction;

清空表数据:

      delete from orderitems where order_num=20010;

 

      delete from orders where order_num=20010;

mysql> select * from ttt;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    1 |
+---+------+------+
1 row in set (0.00 sec)
mysql> truncate table ttt;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from ttt;
Empty set (0.00 sec)

      commit;

当多个连接同时连在一个数据库中时,truncate 命令无法使用

 

 

    3、使用保留点:简单的rollback和commit语句就可以写入或撤销整个事务处理,但是更复杂的事务处理可能需要部分提交或回退。

 

   为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符,这样需要回退,可以回退到某个占位符。

自动提交(默认开启)

   savepoint delete1;


   rollback to delete1;  

 

    

即在我们数据语句后,系统自动给我们加上了COMMIT;

    4、更改默认的提交方式

  • autocommit可以在session级别设置
  • 每个DML操作都自动提交
  • DDL永远是自动提交,无法通过rollback回滚

    mysql> show variables like ‘%autocommit%’;
    +—————+——-+
    | Variable_name | Value |
    +—————+——-+
    | autocommit | ON |
    +—————+——-+
    1 row in set (0.00 sec)

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

    mysql> show variables like ‘%autocommit%’;
    +—————+——-+
    | Variable_name | Value |
    +—————+——-+
    | autocommit | OFF |
    +—————+——-+
    1 row in set (0.00 sec)

      默认的mysql行为是自动提交所有的改动,但是你可以设置Mysql不自动提交修改,如下:  

此时,在这个session中将DML将不会自动提交;

      set autocommit=0;

 

 

而如果在DML语句后我们进行了一句 DDL语句:

三、事务隔离级别

alter table ttt add new
int(11);增加了一个字段;此时之前的DML也会自动提交,

    事务隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

因为DDL永远都会在语句后面自动COMMIT,而也顺带把之前的DML语句也提交了;

    1、串行化(Serializable):所有事务一个接一个执行,这样可以避免幻读(phantom
read),对于基于锁来实现的并发控制的数据库来说,串行化要求在执行范围查询的时候,需要获取范围锁,如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需回滚该事务。  

 

    2、可重复读(repeated
read):所有被select获取的数据都不能被修改,这样就可以避免一个事务前后读取不一致的情况。但是没有办法控制幻读,因为这个时候事务不能更改所选的数据,但是可以增加数据,因为强恶意事务没有范围锁。(事务a读取数据,事务b可以同样读取,不可以更改数据,但是可以增加数据)

 基本属性

    3、读已提交(read
commit):被读取的数据可以被其他事务修改,这样可能导致不可重复读,也就是说,事务读取的时候,获取读锁,但是在读完之后立即释放(不需要等事务结束),而写锁则是事务提交之后才释放的,释放读锁之后就可能被其他事务修改数据。改等级也是sql
server默认的隔离等级。(事务a读取数据,事务b不可以读取数据,事务b可以修改数据)


    4、读未提交(read
uncommitted):最低的隔离等级,允许其他事物看到没有提交的数据,会导致脏读。

 

 

事务的四个基本属性(ACID)酸

    总结:1、四个级别逐渐增强,每个级别解决一问题;

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

        2、事务级别越低,性能越差,大多数环境read
committed就可以用了。

 

事务的原子性(事务被打包一起执行或者一起撤销)

  • 包含在事务中的操作要么全部被执行,要么都不执行
  • 中途数据库或者应用发生异常,未提交的事务都应该被回滚

 

事务的一致性(各种约束条件,保证事务的正确合理,完成性)