多事务访问数据库
- 对于我们的业务去访问数据库,往往都是多个线程并发执行多个事务的,对于数据库而言,他会有多个事务同时执行,可能这多个事务同时更新和查询同一条数据,所以这里会有一些问题需要数据库来解决
- 多事务要是对缓存页里的同一条数据同时进行更新或者查询,此时会产生:脏读,脏写,不可重复读,幻读的问题
脏写
- 两个事务,事务A和事务B同时更新一条数据,事务A先把它更新为A值,事务B紧接着就把他更新为B值,然后A回滚,导致B事务更新的数据没了。
脏读
- 事务A更新了为A值,事务B查询到A值,用它进行业务的操作,然后事务A回滚了;本质就说事务B查询事务A修改过的数据,但是此时事务A还没提交,所以事务A随时会回滚导致事务B再次查询就读不到刚才事务A修改的数据了。
无论是脏读还是脏写,都是因为一个事务去更新或者查询了另外一个还没提交的事务更新过的数据。
不可重复读
- 针对的是已经提交的事务修改的值,被你事务给读到了,你事务内多次查询,多次读到的是别的已经提交的事务修改过的值,这就导致不可重复读了。
幻读
- 查询到之前没有看到过的数据,
SQL标准的隔离级别
read uncommitted
- 不允许脏写,就是说,不可能两个事务在没提交的情况下去更新同一行数据的值
read committed
- 不允许脏写,脏读。别的事务没提交的时候,绝对读不到别人修改的值
repeatable read
- 不允许脏写,脏读,不可重复读;事务一旦开始,多次查询同一个值,会一直读到同一个值。会发生幻读
serializable
Mysql的隔离级别
- mysql的默认隔离级别是RR,而且Mysql的RR级别可以避免幻读。
- mysql事务默认情况下不会发生脏写,脏读,不可重复读和幻读的问题,事务的执行都是并行的。
- 修改mysql的默认事务隔离级别命令
SET [global|session] TRANSACTION ISOLATION LEVEL level