mysql 事务隔离级别 详解

问题

在工做中真实遇到的问题:用python链接mysql,查询数据,同时有别的代码在更新mysql中的数据,前者是一直是保持链接的数据库,每一分钟select一次,但第二次却查不到更新后的数据?why?html

mysql客户端链接查询不到最新数据的问题?python

查询资料结果

应该是mysql的事务隔离级别的设置问题,把 mysql 的 Innodb 的默认事务隔离级别是重复读repeatable read)修改成 提交读read committed) 便可。mysql

什么是事务?

概念:sql

  例如:在关系数据库中,一个事务能够是一条SQL语句,一组SQL语句或整个程序数据库

举例并发

  修改表中的数据,首先是删除原有记录,而后再插入,有2步,可是若是插入失败的话会致使数据丢失。性能

  用事务的概念来处理:删除和插入是一件事情,只有2步都成功,数据才发生改变。否者,恢复到原来的数据。spa

mysql事务的隔离级别

1.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。.net

2.Repeatable read (可重复读):可避免脏读、不可重复读的发生。【在一个事务中,对于同一份数据的读取结果老是相同的,不管是否有其余事务对这份数据进行操做,以及这个事务是否提交】htm

3.Read committed (读已提交):可避免脏读的发生。【只有在事务提交后,其更新结果才会被其余事务看见】

4.Read uncommitted (读未提交):最低级别,任何状况都没法保证。

** 对于多数应用程序,能够优先考虑把数据库系统的隔离级别设为Read Committed,它可以避免脏读,并且具备较好的并发性能。

** 每一个数据库链接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别。

在MySQL数据库中查看当前事物的隔离级别:

select @@tx_isolation; 或者是 show variables like '%iso%';

在MySQL数据库中设置事务的隔离级别为 Read Committed :

set global transaction isolation level read committed;

若是遇到不容许修改:

是由于权限问题,先登出mysql,切换到root下,而后再去修改 @@tx_isolation

数据库事务的四大特性(ACID)

 1.原子性(Atomicity)

  是指事务包含的全部操做要么所有成功,要么所有失败回滚。所以事务的操做若是成功就必需要彻底应用到数据库,若是操做失败则不能对数据库有任何影响。

2.一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另外一个一致性状态,也就是说一个事务执行以前和执行以后都必须处于一致性状态。

  拿转帐来讲,假设用户A和用户B二者的钱加起来一共是5000,那么无论A和B之间如何转帐,转几回帐,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

3.隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,好比操做同一张表时,数据库为每个用户开启的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始以前就已经结束,要么在T1结束以后才开始,这样每一个事务都感受不到有其余事务在并发地执行。

  关于事务的隔离性数据库提供了多种隔离级别,即上文提到的。

4.持久性(Durability)

   持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使是在数据库系统遇到故障的状况下也不会丢失提交事务的操做。

  例如咱们在使用JDBC操做数据库时,在提交事务方法后,提示用户事务操做完成,当咱们程序执行完成直到看到提示后,就能够认定事务以及正确提交,即便这时候数据库出现了问题,也必需要将咱们的事务彻底执行完成,不然就会形成咱们看到提示事务处理完毕,可是数据库由于故障而没有执行事务的重大错误。

 

参考连接

https://blog.csdn.net/dong976209075/article/details/8802778

http://blog.itpub.net/30127122/viewspace-2134370/

https://www.cnblogs.com/fjdingsd/p/5273008.html

https://www.cnblogs.com/ctaixw/p/5867414.html

相关文章
相关标签/搜索