废话不多说,直接看图:
上面就是一个简单的事务流程 ,其实呢,在我们平时操作的MySQL语句都涉及到了事务处理,每一条语句都是一个事务,mysql客户端默认是开启了自动提交事务,可以这样查看:
上面1就是开启自动提交事务,当我们提交sql语句的时候,mysql就自动帮我们commit了。我们可以马上就会查看到相应的结果。
我们可以关闭上面的自动提交事务,可以如下设置:
0就代表关闭了自动提交。
那么我们展示一下,关闭了自动提交之后,语句会怎么处理,说一下,你要看MySQL语句执行之后的处理情况,就必须通过两个客户端操作才能看到处理情况,一个客户端语句处理,一个展示,不要在一个客户端展示效果。
关闭自动提交之后:
先在一个客户端看一下这张表的原始情况,然后我们在执行一下操作:
我们把这里是想把李四的钱 - 500变成和张三一样。
上面操作执行了,从另外一个客户端查看表的数据情况:
看吧,数据好像没有改变,原因在于我们没有commit数据。
我们从操作客户端提交一下数据:
然后在从另外一个客户端查看数据情况:
上面数据就改过来了,也就是说,当没有设置自动提交事务,每一条语句我们就只能手动提交。
下面说一下事务处理原理:
下面说一下这个回滚点的操作:
回滚:一听就是回到相应的位置
你自己设置一个相应的位置设置回滚点就行,自己定义
下面说一下事务的隔离级别:
在我们程序运行的过程中,用户对数据库的访问都是并发的,也就是说,会出现多个用户访问同一个数据的问题,简单说就是,会出现多个事务之间相互干扰的问题:
下面说一下mysql的四种隔离级别:
下面说一下隔离级别的相关命令:
比如我们查看当下客户端事务的隔离级别:
很明显是不是可重复读。
同样我们可以设置事务的隔离级别:
设置之后,必须重新启动客户端:
下面我们展示一下脏读的问题,这都是并发造成的问题,多个用户访问同一个数据,事务隔离级别低:
先把事务隔离性设置为read uncommitted,设置方法如上,读未提交,这样才会产生脏读问题:
我们先来看一下全是数据表的数据:
既然是多个用户来操作数据,那么我们建立两个客户端:
两个窗口都开启事务:
我们在左边这个窗口更新一下数据,一个账户加500,一个账户减500,未提交:
然后在右边的窗口查询一下账户:
和明显,读取到了另外一个事务未提交的数据,应该就是从临时日志取出来的。
然后把左边窗口回滚一下:
右边窗口钱就没了:
上面就明显看到数据安全性非常不高,比如右边向左边支付500,左边一看钱到了,然后右边一rollback,左边钱就没了。
解决脏读问题很简单:提升安全级别,只有读未提交才产生脏读,比如改成读已提交
来说一下,不可重复读演示,演示不可重复读,必须把事务隔离级别设置成read committed
不可重复读:一个事务中,两次读取的内容是不一样的。
开启两个窗口,还是把事务打开.
我们来看一下原始数据:
还是在左边的窗口更新数据,注意把数据提交
右边的窗口 查询一下:
这个时候,就会出现数据读取不一致的问题。
如何解决不可重复读的问题,就隔离级别提升为repeatable read
同一个事务中,要保证数据一致性,必须使用repeatable read级别来读取数据。
下面简单说一下幻读:
使用serializable隔离级别,就会阻止幻读的产生,开启了seriable隔离级别,一个事务就会等待另外一个事务commit之后才会执行当前操作。