mysql的事务隔离共分为四个级别:分别为read uncommitted(读未提交), read committed(读提交),repeatable read (重复读,同时需要声明重复读是mysql默认的事务隔离级别),最后一个为serializable(序列化)。
这四种级别在读取数据是会遇到不同的问题。
read uncommitted 会出现脏读,不可重读,幻读的现象。
read committed 会出现不可重读,幻读的现象。
repeatable read 会出现幻读的现象。
serializable 最为安全。
脏读:假设有 a b 两位,a给b转了100块钱,b发现自己账户多了100块,但是此时a发现转的钱不对,撤销了事务(rollback),这样就出现了a没有转钱,而b发现自己多了100,当然当b再次查询时,账目又恢复正常。说白了就是b读取了a未提交的数据。
不可重读:你拿钱去买东西,在买之前查看银行卡有1000元,结果在你买的过程中你的女朋友转走了500元,当你付款时发现少了500元,不可重读就会产生这样的问题。注意:是一条数据发生了改变。
幻读:你去公司面试,要打领带,在你衣橱的时候有一条领带,这时候你的女朋友又放了一条,当你再次打开衣橱的时候发现两条领带,这就是幻读。
不了重读和幻读的区别是前者是一条数据发生了改变,后者是对其他数据进行了改变。
那么问题来了,serializable最安全,为什么不用他呢,任何事物不是十全十美的,它的运行速度相对慢。
read uncommitted运行的快,但是并没有快多少,所以大多数数据库的事务隔离级别是read committed,但是mysql 是repeatable read。
当然有兴趣的可以自己做实验。
但是一定要先开始事务,start transaction,因此在编写语句后,需要自己手动提交,只有这样才可以手动提交。