一.事务是一系列的操作,我们可以通过事务来控制整个更新和抛出异常的事务和提交。
我们知道事务的概念后,需要知道为什么需要事务,在一个global的数据库中,同一张表可以被不同的用户同时进行操作,这样就会出现异常的情况,例如:用户A在修改数据库ID=1的值时,用户B在查询当前数据库为ID=1的数据时,就会抛出异常;比如运行一段SQL语句中,SQL中写错了,会报异常的结果。所以我们就可以通过事务来控制用户对数据库操作时抛出异常和提交的捕获。
二、我们在了解了事务后,现在了解事务的提交方式
先查询当前的事务是手动模式还是自动模式
select @@autocommit;
默认状态下是自动模式的,我们作为开发者而言,需要将自动模式转换为手动模式进行调试,0表示手动模式,1表示自动模式。
set @@autocommit = 0;
现在在我们设置好手动模式后就可以开启事务了
start transaction;
我们在同时开启两个事务后,对两个事务进行不同的控制,发现会出现一下这些并发的情况,所以我们解决这种并发问题就可以通过设置事务的隔离级别,对其事务进行隔离,从而达到解决并发的问题。
这是Mysql中的四种隔离级别:
查看当前的隔离级别
select @@transaction_isolation;
在没有更改过隔离级别上,我们的隔离级别应该是默认的repeatable read。
修改事务的隔离级别
set [session/global] transaction level [4种隔离级别]
①事务A对数据查询的时候,事务B更改了数据的内容,会对事务A造成影响,事务B修改完后,事务A就会报错。
上面这种情况我们称之为“脏读”
解决脏读的方法将事务的隔离级别给更改为read uncommitted.改完后就会发现,现在在不提交的情况下,对其修改后,不会影响值了。
②事务B对其操作提交后,事务A仅仅查询数据库发现数据已经被变更,注意这个B已经提交了!,这样事务A就会报错。
上面这种情况我们称之为“不可重复性”
解决不可重复性的方法是将事务的隔离级别更改为read committed。改完后就会发现,在B提交过后,也不会影响值A的改变。
③在事务B中插入新数据时,另外事务A就会受到影响,因为事务A中查不到这个值,但在事务B中,是可以查的到这个值的。
上面这种情况我们称之为“幻读”
我们在解决②的问题后就会出现幻读的问题,那么解决幻读的方法是将事务的隔离级别更改为serializable,这样我们就可以在事务B插入新数据的时候,事务A就不能对数据库进行操作,会挂载一个“锁”,让A不能执行SQL语句,当B插入完成之后,A就会执行SQL语句了,这便是serializable的执行方式。
总结完事务后,我们可以知道,使用越高级别的隔离级别,虽然安全性会越高,但是性能反而是最低的,反之,安全性越低,但是性能越高。