mysql事务详解

1、什么是事务

用户访问数据库时,数据库会为用户开启一个进程,用户可以通过这个进程对数据库进行增、删、改、查的操作,这个进程就称为事务。

2、事务的特性

(1)原子性:

   指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

(例如:在一个事务中,对t1表添加一个数据,并对t2表删除一个数据,这两步操作要么都成功,要么都不成功,不会只运行一个,另一个失败)

(2)一致性:

指事务的操作使数据库从一个一致性状态变为另一个一致性状态

(3)隔离性:

指多个用户并发访问数据库时,数据库会为每个用户开启一个事务,每个事务访问的数据不能被其他事务操作数据干扰,多个并发事务之间要相互隔离

(4)永久性:

指一个事务一旦被提交它对数据库的改变是永久的

3、事务的隔离级别

事务的隔离级别分为4个:READ UNCOMMITTED ,READ COMMITTED,REPEATABLE READ,SERIALIZABLE

(1)READ UNCOMMITTED :最低级别,脏读、不可重复读、虚读都会发生;

(2)READ COMMITTED:防止脏读的发生,不可重复读,虚读都会发生;

(3)REPEATABLE READ:防止脏读,不可重复读,虚读的发生(MySQL默认隔离级别);

(4)SERIALIZABLE:防止脏读,不可重复读,虚读的发生(对事务上锁,一个事务操作时,另一个事务会被阻塞)

4、脏读、不可重复读、虚读的含义

(1)脏读:一个线程中的事务读取到了另一个线程中事务未提交的数据;

(2)不可重复读:一个线程中的事务,前后读到同一条记录不一致;

(3)虚读:一个线程中的事务,前后读到的记录条数不一致;

5、查看/更改隔离级别

(1)查看隔离级别:select @@tx_isolation;

(2)更改隔离级别:set session transaction isolation level 四个级别之一     (暂时更改,关闭MySQL会恢复到默认)

                                set global transaction isolation level 四个级别之一        (永久更改)

6、演示出现脏读、不可重复读、虚读

注意:将表的存储引擎改为INNODB格式,默认为MYISAM不支持事务

            alter table 库名.表名 ENGINE=INNODB

(1)脏读

1、设置3种类型的隔离级别

mysql事务详解2、开启事务:start transaction

3、在第一个事务中将id=1的age更改为100,并没有提交,分别在其他两个事务中查询,read uncommitted隔离级别的事务中出现脏读,而read committed事务中读取的id=1的age并没有改变。

mysql事务详解

(2)不可重复读

1、同样开启三种隔离级别的事务

2、在默认级别事务中更改数据,并没有提交事务,在read committed没有出现脏读;

mysql事务详解

3、将左边事务提交,右边事务依旧访问student表格,此时会出现不可重复读

mysql事务详解

(3)虚读

1、同上,开启两个事务

2、在左边事务中插入一条数据并提交,右边事务不提交,查询数据

mysql事务详解