事务的四大特性 ACID
原子性:事务的所有操作要么全部成功,要么全部失败回滚。
一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性:一个事务的执行不受其他事务的干扰。
持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
隔离级别产生问题
脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据(未提交意味着这些数据可能会回滚,可能最终不会存到数据库)。
不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了,读取了前一个事务提交的数据。
幻读:事务在检索期间,其它事务对数据执行了操作,导致前后两次检索的数据不一样。
例如:事务1对一个表中所有数据某个字段值从“Y”修改为“N”的操作,这时事务2又对这个表中插入了一行数据,而这个数据的字段值是为“Y”。事务1如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是事务2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
MySQL数据库的四种事务隔离级别(从低到高)
Read Uncommitted(读未提交):所有事务都可以看到其他未提交事务的执行结果。(基本上没用)。
Read Committed(读已提交):一个事务只能看见已经提交事务所做的改变。
Repeatable Read(可重读):确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。(MySQL的默认事务隔离级别)
Serializable(可串行化):通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 不能避免 | 不能避免 | 不能避免 |
读已提交 | 能避免 | 不能避免 | 不能避免 |
可重读 | 能避免 | 能避免 | 不能避免 |
可串行化 | 能避免 | 能避免 | 能避免 |
查看mySQL的数据库隔离级别
先看下mysql版本,执行对应sql语句。
-- 查看版本
select version();
-- 旧版本也就是5.x
select @@tx_isolation;
-- 新版本
select @@transaction_isolation;
-- 设置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;