mysql数据库,当且仅当引擎是InnoDB,才支持事务;
1、隔离级别
事务的隔离级别由低到高依次为分为:未提交读(read uncommitted)、已提交读(read committed)、可重复读(repeatable read)、串行化(serializable)。
1.1未提交读
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;—出现脏数据
1.2已提交读
A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;—不可重复读
1.3可重复读
A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;
1.4串行化
不允许读写并发操作,写执行时,读必须等待;
脏读:(针对未提交的数据)一个事务在更新一条记录,未提交前,第二个事务读到了第一个事务更新后的记录,那么第二个事务就读到了脏数据,会产生对第一个未提交
数据的依赖。一旦第一个事务回滚,那么第二个事务读到的数据,将是错误的脏数据。
不可重复读:(读取数据本身的对比)一个事务在读取某些数据后的一段时间后,再次读取这个数据,发现其读取出来的数据内容已经发生了改变,就是不可重复读。
幻读:(读取结果集条数的对比)一个事务按相同的查询条件查询之前检索过的数据,确发现检索出来的结果集条数变多或者减少(由其他事务插入、删除的),类似产生幻觉。
2.数据库设置事务隔离级别
//查看当前事物级别:
SELECT @@tx_isolation;
MySQL 默认的级别是:Repeatable read 可重复读。
//设置mysql的隔离级别:
set session transaction isolation level 设置事务隔离级别
//设置read uncommitted级别:
set session transaction isolation level read uncommitted;
//设置read committed级别:
set session transaction isolation level read committed;
//设置repeatable read级别:
set session transaction isolation level repeatable read;
//设置serializable级别:
set session transaction isolation level serializable;