Heim >Datenbank >MySQL-Tutorial >对数据库事务的总结_MySQL

对数据库事务的总结_MySQL

WBOY
WBOYOriginal
2016-06-01 13:29:02961Durchsuche

bitsCN.com

对数据库事务的总结

 

1.什么是事务?

 事务是逻辑上的一组操作,而组成这一组操作的是各个单位,要么全部执行成功,要么全部执行失败。

 

示例:银行转帐,要么转帐成功,要么失败。不可以出现A帐户的钱少了,B帐户上的钱没有增加。

 

2.事务的四大特性(ACID)面试常考

a.原子性(Atomicity)

 事务是指一组不可分割的单位,事务中的操作要么全部执行成功,要么全部失败

 

b.一致性(Consistency)

 事务必须保证数据库从一个一致性状态转换到另一个一致性状态

 

示例:当AB两个帐户在未转帐前两个帐户上的总金额是2000,那么在完成转帐之后,AB两个帐户上的总金额还得是2000。

 

c.隔离性(Islation) (重点)

 当多个用户并发的向数据库发生访问时,数据库为每一个用户分别开启一个事务,事务与事务的数据是不允许相互干扰的,

 要将多个事务之间相互隔离开来。

d.持久性

 一旦事务被commit,那么数据库就必须将数据进行永久保存,即使之后数据库发生了故障,也不能影响到已经被提交了的数据。

3.四种隔离级别

1).在列举这四种隔离级别之前,先来说一下如果不设置隔离级别的话,会造成的以下三种问题:

a.脏读

 

有AB两个事务,AB都并发开启事务,A查询到了B还未commit提交的数据,这就叫脏读。

b.不可重复读

 

A开启了一个事务,写了一条查询某一条记录的select语句,得到了一个结果,当再次执行

这个select语句时,得到的结果与先前的结果不同,这就是不可重复读。注意:不可重复读

这种现象,不可以说是对的,也不可以说是错的,要看使用场景。

c.虚读(幻读)

 

有AB两个事务,AB都并发开启事务,B事务insert了一条新的记录,还未提交,然后A再查询这张表

中所有的记录,发现多了一条新记录;然后B事务rollback;commit;A事务再查询这张表中所有的记录,

发现刚刚多出的一条新记录消失了,这就是虚读。

2)隔离的四种级别

a.serializable 这是最高级别,可以避免上述三种问题的发生,但是是单线程  性能最低

 

b.repeatable read:可以避免 脏读 不可重复读  但可能会发生虚读 

 

c.read committed:可以避免脏读 不可避免不可重复读,虚读

 

d.read uncommitted:脏读,不可重复读,虚读都可能会发生 ,但性能最高

 

注:MySQL数据库的默认事务级别是repeatable read,并且MySQL数据库支持上述四种隔离级别。

Oracle数据库只支持serializable 和 read committed 这两中隔离级别。

 

bitsCN.com
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn