对于mySQL来说,事务是保证数据存储安全的一个机制。
举个简单的例子,当一个用户到银行里转账,他需要两个步骤才能完成存钱的过程:第一步,将钱给客户经理,让客户经理将钱存入,第二部,钱被转到对方的账户上。
这两步是两个独立的过程,现在可能出现这么一种情况,在完成第一步之后,银行的系统准备将你的钱汇到对方账户的时候,发现对方账户存钱问题,你的钱无法汇款过去。但是你的钱已经存入到银行中.....
这个时候,问题就出现了,你给了银行钱,但是钱没有转账成功。
事务就是为了处理这样的问题而被引入数据库。其将以上两个步骤捆绑到一起,一旦第二部没有完成,那么第一步也无法执行,这样,就妥善的解决了这个可能出现的异常情况。
这只是一个最简单的情况,真正的事务,可以处理更加复杂的情况。
在控制台的页面,你可以通过 start transaction 来开启一个事务。
当你在输入以上的命令的时候,你之后执行的一系列的操作,在你没有commit之前,都不是有效的操作。也就是说你可以通过rollback命令,让这些操作全部无效。
说到事务,就必须说事务的隔离级别。
隔离级别就有点类似程序语言中的多线程同步问题。当两个事务同时对一个数据表进行操作的时候,就可能出现一系列的问题,比如A用户,修改了表中的数据,而B用户在读取的时候,就可能读取到修改后的数据,而其实他需要的是未被修改的数据。
在多线程问题上,我们可以通过同步来保证安全性。
但数据库则不同,为了让数据能够更快的被访问,我们尽量不能够将数据库中的表具有同步的特性,这样会造成数据的访问速度很慢。
而且很多情况下,数据库都只是需要被读取数据,对于一个表,无需要加上锁,而让其他用户无法访问。隔离级别就是被用在处理这种情况。
基于访问速度和安全性两个方面考虑,通常情况下,事务有四种隔离级别,读未提交(read uncommited)读已提交(read commited),可重复读(respeatable),可串行化(serializable).
这四种隔离级别,按照上面所说的顺序,安全性依次增加。安全性增加带来的就是访问速度的降低。下面依次说一下这四种隔离级的性质。
1,读未提交
在该隔离级别下,当A对表格进行修改,而并没有进行提交的时候,B在进行读取的时候,依然会读取到被A修改后的数据。
2,读已提交
在该隔离级别下,当A对表格进行修改,在A没有提交之前,B在进行读取数据的时候,A的修改无效。但一旦A提交事务,那么B就会读取到A修改后的数据。
3,可重复读
在该隔离级别下,当A对表格进行修改,在A提交之后,B在进行数据读取的时候,依然不会读取到A修改后的数据。但当A进行数据增加并提交之后,B就可能访问增加的数据。
4,串行化
这个是安全性最高的级别,B在没有提交事务之前,A是无法对数据进行增加,删除等操作的。如果在B事务没有提交之前,A插入一条新的数据,那么该执行语句不会被执行,他需要等到B事务提交完毕之后,该插入操作才能够顺利完成。
通常情况下,MYSQL的默认隔离级为可重复读。
下面再说下隔离级别的一些比较常用的简单命令:
start transaction; 开启事务
commit; 提交事务
select @@tx_isolation; 查看当前的隔离级别
set session transaction isolation level read uncommited; 设置隔离级别为 读未提交
set session transaction isolation level read commited; 设置隔离级别为 读已提交
set session transaction isolation level read repeatable read; 设置隔离级别为可重复读;
set session transaction isolation level read serializable; 设置隔离级别为 串行化