Mysql数据库事务

需要掌握:

一: 事务的作用
二: 事务的四大特性(重要掌握)
三: 事务的并发读问题(了解)
四: 掌握Mysql开启和结束事务
五: 事务的四个隔离级别(了解)

什么是事务?

数据库事务(Database Transaction),是指作为单个逻辑工作单元执行一系列操作,要么完全执行,要么完全的不执行;

简单来说:事务就是将一堆的sql语句(通常是增删改查操作)绑定在一起执行,要么都执行成功,要么集体失败;---都执行成功才算成功,否则会恢复到执行之前的状态.

事务的四大特性

四大特性特性是:
(一) 原子性 : 事务中所有操作都是不可分割的原子单位.事务中的所有操作要么全部执行成功,要么就全部执行失败;
(二) 一致性 : 事务执行后,数据库的状态与其他的业务规则都保持一致.例如转账业务:无论事务执行成功与否,参加转账的两个账户金额之和在事务前后都应该是保持不变的;
(三) 隔离性 : 隔离性是指在并发操作时,不同事务应该隔离开来,使每个并发的事不会相互干扰.也就是在说在事务中查看数据更新五时,数据所处的状态要么是另一个事务修改之前的状态,要么是修改之后的状态.事务不会查看到中间数据的状态.
(四) 持久性 : 一旦事务提交成功,事务中的所有数据操作都必须被持久化到数据库中,即便是事务提交后,数据库立马崩溃,在数据库重启时,也能将数据重新恢复


Mysql中的事务

在默认的情况下,Mysql每执行一条SQL语句,都是一个单独的事务.因为底层在执行SQL语句之前会自动开启事务,在SQL语句执行完毕后,会立即结束事务;
如果需要在一个事务中包括多条的SQL语句,就需要手动的添加和结束事务;

开启事务: start transaction
结束事务: commit(提交事务) 或者 rollback(回滚事务)

事务的并发读问题

多个事务对相同的数据同时进行操作,就称为事务并发;
在事务并发时,如果没有采取必要的隔离措施,可能会导致各种的并发问题,破坏数据的完整性.这些问题中,其中有三类是读问题:脏读,不可重复读,幻读;

一:脏读

在一个事务中,读取到了另一个事务中没有提交的数据,称读到了脏数据;

二:不可重复读

对同一个记录的两次读取结果不一致,因为在两次查询期间,有另一个事务对记录做了修改(是针对修改操作);

三:幻读(虚读)

对同一张表的两次查询结果不一致,因为在两次查询期间,有另一个事务进行了插入或者删除操作(主要针对插入或删除操作)

注意 :在Mysql默认是不允许出现脏读或者不可重复读


事务隔离级别

事务的隔离级别分为四个等级,在相同数据环境下,对数据执行相同的操作,设置不同的隔离级别,可能导致不同的结果.不同事务隔离级别能够解决的数据并发问题的能力也是不同的;

set tx_isolation=''
一: READ UNCOMMITTED(读未提交数据)

安全性最差,可能出现任何的事务并发问题(脏读,不可重复读,幻读)
但是性能最好!(不推荐使用)

设置隔离级别-----: set tx_isolation='read-uncommitted';

读取到了还未提交的事务

二: READ COMMITTED(读已提交数据)---ORACLE默认

安全性较差
性能较好!
---可以防止脏读,但是不能防止不可重复读和幻读;

设置隔离级别-----:set tx_isolation='read-committed';

---如果事务对数据进行了更新操作,只能等事务提交后,才对读取数据,这样会解决脏读问题.

三: REPEATABLE READ(可重复读)---MYSQL默认

安全性较高
性能较差
可以防止脏读和不可重复读,但不能防止幻读;;

设置隔离级别-----:set tx_isolation='repeatable-read';

---开始读取数据时(开启事务时);不再允许修改操作---

四: SERIALIZABLE(串行化)

安全性最高,不会出现任何的并发问题,因为他对同意数据的访问是串行的,不是并发访问
性能最差!(不适用!!)---比较消耗数据库性能

设置隔离级别-----:set tx_isolation='serializabla';

李浩波
4 声望0 粉丝