一、简述mysql事务
mysql是一个B/S架构的软件,那么同于同一个服务器来说,可以有若干个客户端来连接,每一个客户端连接与服务器连上后都可以称之为一个会话(session),每一个客户端都可以在自己的会话中向服务器发起一个请求语句,一个请求语句可能是某个事务的一部分,那么对于服务器来说可能处理多个事务。事务是具有ACID的特性,也就是隔离性。理论上当一个事务对数据进行访问时,其他的事务是不可以访问当前数据的,只能排队等候,只有在当前事务提交后才能访问该数据。但这样对于性能影响太大,即要保证事务的隔离性,又想要服务器访问同一数据的多个事务时性能高一些,就需要取舍了。
二、数据并发问题
1、脏写
事务A修改了另一个未提交事务B修改过的数据,就会出现脏写的情况。
2、脏读
事务A读取了已经被事务B更新但没有提交的字段。
3、不可重复读
事务A读取一个字段,事务B更新了该字段,之后事务A再次读取该字段发现值不相同了。
4、幻读
对于两个事务,事务A从一个表中读取了一个字段,然后事务B在该表中插入了一些新的行。之后事务A再去该表读取时,发现多了几行,就会产生幻读。
这里的注意。是指明为插入才产生幻读,而在删除是不存在幻读的现象!
三、SQL中的四种隔离级别
由上我们可以得到事务在并发的过程中可能存在的问题
脏写>脏读>不可重复读>幻读
于是在sql中提出了四种隔离级别来解决上述的问题。
1、读为提交
2、读已提交(oracle默认隔离级别)
3、可重复读(mysql默认隔离级别)
4、可串行化