废话不多说,直接看图:

java 单独提交事务 java 自动提交事务_数据库

上面就是一个简单的事务流程 ,其实呢,在我们平时操作的MySQL语句都涉及到了事务处理,每一条语句都是一个事务,mysql客户端默认是开启了自动提交事务,可以这样查看:

java 单独提交事务 java 自动提交事务_数据库_02

上面1就是开启自动提交事务,当我们提交sql语句的时候,mysql就自动帮我们commit了。我们可以马上就会查看到相应的结果。

我们可以关闭上面的自动提交事务,可以如下设置:

java 单独提交事务 java 自动提交事务_数据_03

0就代表关闭了自动提交。

那么我们展示一下,关闭了自动提交之后,语句会怎么处理,说一下,你要看MySQL语句执行之后的处理情况,就必须通过两个客户端操作才能看到处理情况,一个客户端语句处理,一个展示,不要在一个客户端展示效果。

关闭自动提交之后:

先在一个客户端看一下这张表的原始情况,然后我们在执行一下操作:

java 单独提交事务 java 自动提交事务_数据库_04

我们把这里是想把李四的钱 - 500变成和张三一样。

上面操作执行了,从另外一个客户端查看表的数据情况:

java 单独提交事务 java 自动提交事务_数据_05

 

看吧,数据好像没有改变,原因在于我们没有commit数据。

我们从操作客户端提交一下数据:

java 单独提交事务 java 自动提交事务_java_06

 

然后在从另外一个客户端查看数据情况:

java 单独提交事务 java 自动提交事务_java_07

 

上面数据就改过来了,也就是说,当没有设置自动提交事务,每一条语句我们就只能手动提交。

 下面说一下事务处理原理:

java 单独提交事务 java 自动提交事务_数据库_08

 下面说一下这个回滚点的操作:

回滚:一听就是回到相应的位置

java 单独提交事务 java 自动提交事务_mysql_09

你自己设置一个相应的位置设置回滚点就行,自己定义

下面说一下事务的隔离级别:

java 单独提交事务 java 自动提交事务_mysql_10

 

在我们程序运行的过程中,用户对数据库的访问都是并发的,也就是说,会出现多个用户访问同一个数据的问题,简单说就是,会出现多个事务之间相互干扰的问题:

java 单独提交事务 java 自动提交事务_数据_11

下面说一下mysql的四种隔离级别:

java 单独提交事务 java 自动提交事务_java 单独提交事务_12

 

 下面说一下隔离级别的相关命令:

比如我们查看当下客户端事务的隔离级别:

java 单独提交事务 java 自动提交事务_数据_13

很明显是不是可重复读。

同样我们可以设置事务的隔离级别:

java 单独提交事务 java 自动提交事务_java 单独提交事务_14

 

设置之后,必须重新启动客户端:

 

java 单独提交事务 java 自动提交事务_java 单独提交事务_15

 下面我们展示一下脏读的问题,这都是并发造成的问题,多个用户访问同一个数据,事务隔离级别低:

先把事务隔离性设置为read uncommitted,设置方法如上,读未提交,这样才会产生脏读问题:

我们先来看一下全是数据表的数据:

java 单独提交事务 java 自动提交事务_mysql_16

既然是多个用户来操作数据,那么我们建立两个客户端:

两个窗口都开启事务:

java 单独提交事务 java 自动提交事务_数据库_17

 我们在左边这个窗口更新一下数据,一个账户加500,一个账户减500,未提交: 

java 单独提交事务 java 自动提交事务_数据库_18

然后在右边的窗口查询一下账户:

java 单独提交事务 java 自动提交事务_java 单独提交事务_19

 

和明显,读取到了另外一个事务未提交的数据,应该就是从临时日志取出来的。

然后把左边窗口回滚一下:

java 单独提交事务 java 自动提交事务_数据库_20

右边窗口钱就没了:

java 单独提交事务 java 自动提交事务_java_21

 

 上面就明显看到数据安全性非常不高,比如右边向左边支付500,左边一看钱到了,然后右边一rollback,左边钱就没了。

解决脏读问题很简单:提升安全级别,只有读未提交才产生脏读,比如改成读已提交

来说一下,不可重复读演示,演示不可重复读,必须把事务隔离级别设置成read committed

不可重复读:一个事务中,两次读取的内容是不一样的。

开启两个窗口,还是把事务打开.

我们来看一下原始数据:

java 单独提交事务 java 自动提交事务_数据库_22

还是在左边的窗口更新数据,注意把数据提交

java 单独提交事务 java 自动提交事务_数据_23

 

右边的窗口 查询一下:

java 单独提交事务 java 自动提交事务_java 单独提交事务_24

这个时候,就会出现数据读取不一致的问题。

如何解决不可重复读的问题,就隔离级别提升为repeatable read

 同一个事务中,要保证数据一致性,必须使用repeatable read级别来读取数据。

下面简单说一下幻读:

使用serializable隔离级别,就会阻止幻读的产生,开启了seriable隔离级别,一个事务就会等待另外一个事务commit之后才会执行当前操作。