MySQL事务隔离级别

来源:互联网 发布:excel如何合并数据 编辑:程序博客网 时间:2024/06/03 17:47

1 事务的特性:ACID

A:Atomic,原子性:指整个数据库事务是一个不可分割的单元。只有事务中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。
C:Consitency,一致性:指数据库事务不能破坏关系数据的完整性和业务逻辑的一致性;比如银行转账事务,不管事务是否成功,其两个人的总钱数是不能改变的。
I:Isolation,隔离性:在并发环境下,不同事务同时操纵相同数据时,每个事务都有各自的完整数据空间。
D:Durability,持久性:指只要事务成功结束,它对数据库所做的更新就永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功时的状态。

事务的ACID特性是由关系数据库管理系统(RDBMS)来实现的。
(1)数据库管理系统采用日志来保证事务的原子性、一致性、持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的状态。
(2)数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能跟新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

2 事务的隔离级别

  对于同时运行的多个事务,当这些事务操作数据库中相同的数据时,如果没有采用必要的隔离机制,就会导致并发问题。

 并发问题有以下几类:

  1)脏读:一个事务读到另一个事务未提交的更新数据

  2)幻读:一个事务读到另一个事务已提交的新插入的数据。

  3)不可重复读:一个事务读到另一个事务已提交的更新数据。


 查看MySQL数据库的隔离级别

    select  @@tx_isolation;

设置MySQL数据库的全局隔离级别

    set  global  transaction  isolation  level  **;       # 其中**代表相应的隔离级别


事务的隔离级别

    有四种:Read Uncommitted ,Read Committed,Repeatable Read,Serializable

   (1)Read Uncommitted(读未提交):一个事务在执行过程中可以看到其他事务没有提交新插入的记录,而且还能看到其他事务没有提交的对已有记录的更新。这种隔离级别会导致读“脏”数据。

   (2)Read Committed(读已提交):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且还能看到已经提交的对已有记录的更新。这种隔离级别可以避免“脏读”,但是会导致不可重复读。Oracle和SQL Server默认的隔离级别


   (3)Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录所做的更新操作。这个隔离级别可以避免脏读、不可重读,但是会存在“幻读”。MySQL默认的隔离级别。


   (4)Serialization(串行化):一个事务在执行过程中,完全看不到其他事务对数据库所做的更新,当两个事务同时操纵数据库中相同数据时,如果第一个事务已经在访问该数据,则第二个事务只能停下来等待,必须等待第一个事务结束后才能恢复运行,因此这两个事务实际上是以串行方式运行。


3 事务隔离级别设置

1)设置Session级别:仅在此练级内有效

2)设置全局级别:仅在运行的数据库系统有效;系统重启后便会失效;

3)在my.ini文件中设置事务的隔离级别:持久性,不会因此而改变,系统重启会读物my.ini配置文件。












原创粉丝点击