具体分析mysql数据库的事务问题包括隔离级别
解决的问题越多,一致性越好,并发性越差,性能越差
使用命令行的模式来演示事务的隔离级别
1、开启了两个连接
使用的数据库的表是:
2、确定数据库
3、show tables
4、查看当前的默认隔离级别
5、查看当前是否为默认提交事务
select variables like ‘%autocommit%’;
6、现在还没有修改自动提交为false,先查看表的数据
7、左边的事务修改数据之后,右边的事务去读取,读取到了更新后的数据。原因是因为默认自动提交事务
8、现在都设置自动提交为false
set autocommit=false;
9、
左边的事务修改的了数据,但是未提交
右边的事务去读取数据,并没有读取到修改后的数据,说明隔离级别为repeatable read 的隔离级别解决了脏读的问题,只要不提交,就读不到。
10、这个时候左边事务提交了,但是右边的事务还是没有读取到,这就是repeatable read可重复读,只要你没有关闭当前事务(右边),那你读取到的数据永远是修改之前的数据。
11、这时候,我结束右边的事务(commit一下就意味着当前事务结束了),然后再去读取数据,发现可以读到新的数据
这就是repeatable read 的隔离级别。如果不关闭当前事务,读取到的永远是修改之前的数据。12、准备修改隔离级别,修改之前查看一下
13、修改全局的事务隔离级别为read commit
而且这个时候立马去查隔离级别,显示的还是repeatable read
这个时候需要ctrl+C,退出mysql,再次进去,然后再查一次发现变成了read commited;当然因为我们修改的是全局的隔离级别,对于左边的事务同理也需要再次去关闭一下才能查看发现已经改好了。
左边事务:
14、这个时候二者的隔离级别都修改成read committed了。
因为重新进来mysql服务,所以,先设置自动提交为false
15、使用数据库
16、修改之前查看user_table的数据
17、左边事务来修改数据且不提交
read committed隔离级别读取不到未提交的数据
18、左边事务提交,右边再去查询
这个时候,就已经读取到了修改并且提交了的数据。其实这种现象我们可以接收,你如果操作数据库,修改了数据并且提交了,在我不关闭当前事务的前提下去读取数据,可以读取到你已经提交的事务,是可以的,情有可原的,所以oracle数据库默认的隔离级别采用的是这种情况。但是mysql就不行,必须关闭当前事务(语句写成commit)才能读取到数据库中已经提交的数据。19、设置隔离级别为读未提交read uncommitted;同理,左右两边都需要重新启动mysql连接
才能查看到当前的隔离级别已经发生改变
右边事务:
左边事务:
现在二者的隔离级别都已经设置成read uncommitted
20、修改数据之前,设置自动提交为false先查看当前数据表中的数据
修改左边的数据,且不提交
我们发现。右边事务读取到了左边事务修改并且未提交的数据
所以隔离级别为read uncommitted的并没有解决脏读的情况。