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种类型的隔离级别
2、开启事务:start transaction
3、在第一个事务中将id=1的age更改为100,并没有提交,分别在其他两个事务中查询,read uncommitted隔离级别的事务中出现脏读,而read committed事务中读取的id=1的age并没有改变。
(2)不可重复读
1、同样开启三种隔离级别的事务
2、在默认级别事务中更改数据,并没有提交事务,在read committed没有出现脏读;
3、将左边事务提交,右边事务依旧访问student表格,此时会出现不可重复读
(3)虚读
1、同上,开启两个事务
2、在左边事务中插入一条数据并提交,右边事务不提交,查询数据