需要的命令:
SHOW VARIABLES LIKE 'autocommit' (ON 自动提交 OFF不是自动提交 需要手动 COMMIT;)
两种方式设置mysql 自动提交事务和关闭自动提交事务(mysql默认自动提交事务)
关闭自动提交事务 开启自动提交事务
第一种 SET autocommit=off; SET autocommit=ON;
第二种 SET autocommit=0; SET autocommit=1;
打开两个cmd mysql 黑窗口
可以看到id为2 的数据
现在将数据库中的数据更改掉
这个时候我们看到手动提交事务那到的是老数据, 自动提交的拿到的是新数据
以及新增记录,也并没有那到新的数据
这个是因为mysql 默认的隔离级别导致的,
读未提交:是读取别的事务没提交数据。产生脏读问题 容易读到脏数据。
读已提交:是读取别的事务以及提交的数据,这个隔离级别 解决了脏读的现象, 但是他有不可重复读取数据问题。
什么是不可重复读取数据呢?
在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取
这种隔离级别是比较真实的数据,每一次读到的数据绝对真实。
oracle 数据库默认的隔离级别是读已提交。
mysql的默认隔离级别是可重复度:可重复读:repeatable read
什么是可重复读取?(提交之后也读不到,永远读取的都是刚开启事务时的数据)
事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。
提交之后也读不到,永远读取的都是刚开启事务时的数据,早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样的数据。读到的是假象。不够绝对的真实。 所以这个隔离级别有幻读的问题
幻读:同时有A,B两个事务,ide是主键,B 插入了一条id=10的数据,提交了 。A :select * from b where id=10; 结果为null,发现没有id=10的数据,他就插入一条id=10数据,发现insert不进去,说主键重复。A又select一次,发现还是没有id=10的数据,可就是insert不进去,就和幽灵一样,所以称为幻读
脏读,不可重复读的区别。不可重复读只有在其他事务提交了,多次select的状态才会改变。
幻读,不可重复读,针对的都是另一方已经提交的事务,不可重复读,对其他已经提交的事务,select会发现和上次不一样。而幻读select都是一样。不过如果别人新增了id=10,他虽然select没有看到,但就是insert不进去。
注意:如果是自动提交,未设置手动提交,则可以看到别的事务修改的数据,不会产生幻读问题
序列化/串行化: serializable(最高的隔离级别)
这是最高隔离级别,效率最低。解决了所有的问题。这种隔离级别表示事务排队,不能并发!
synchronized,线程同步(事务同步)
每一次读取到的数据都是最真实的,并且效率是最低的。l
所以,只需要将手动提交的黑窗口 commit 一下就可以了。