1.什么是事务?
答:对于什么是事务,我并没有找到一个准确的概念。我认为,事务是对数据操作的一种规范,它的目的是为了保证数据的安全性和完整性。尤其在涉及到钱财的业务方面,事务显得尤为重要,例如,银行转账。我们通常会用四个特性来描述事务:ACID,即原子性、一致性、隔离性、持久性。
原子性:事务中的所有操作要么全部成功,要么全部失败,不存在中间态。
一致性:事务中的操作,操作前和操作后,数据的总额保持不变。
隔离性:事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起
持久性:事务中的操作一旦完成,事务产生的结果将被持久化
2.对事务的操作有三个:开启事务、提交事务、回滚事务。
3.mysql数据库要想实现事务支持,前提条件是搜索引擎必须是innodb或者BDB,但是BDB收费。
/*
*由一个或多个活动所组成的一个工作单元。原子确保事务中的所有操作全部发生或全部不发生。如果所有的活动都成功了,事务也就成功了。如果任意一个活动失败了,整个事务也失败并回滚。
一致性(Consistent):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态。现实的数据不应该被损坏。
隔离性(Isolated):事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起。因此,事务应该被彼此隔离,避免发生同步读写相同数据的事情(注意的是,隔离性往往涉及到锁定数据库中的行或表)。
持久性(Durable):一旦事务完成,事务的结果应该持久化,这样就能从任何的系统崩溃中恢复过来。这一般会涉及将结果存储到数据库或其他形式的持久化存储中。
通俗的说事务,指一组操作,要么都成功执行,要么都不执行(原子性)
在所有的操作没有执行完毕之前,其它会话不能够看到中间改变的过程(隔离性)
事务发生前和发生后,数据的总额保持不变(一致性)
事务产生的影响不能被撤销(持久性)*
事务中可能会出现的并发问题有哪些?
答:脏读、不可重复读、幻读。
脏读:两个事务对同一组数据进行操作,其中一个事务读取了另一个事务改写但并未提交的数据,而另一个事务的改写被回滚了,那么第一个事务读取到的数据就是无效的。这就是脏读。
不可重复读:一个事务执行相同的查询操作两次或两次以上,但是每次得到的结果都不相同。这通常是因为另一个并发事务在两次查询期间更新了事务。这就是不可重复读。
幻读:幻读是针对整张表的操作。你要删除一张表中的所有记录,在你删的过程中,有另外一个并发事务向该表添加了一条新数据,当你执行完事务的删除操作之后,你认为没有这张表了,但是一查,这张表还在,你以为出现了幻觉。此为幻读。
另一版本解释:
什么是脏读?读到了某一个正在操作但还没有提交的数据,这样读到的数据很可能不是最终确定的数据,很可能那个人还回滚了。
什么是不可重复读?两次连续的读取,数据不一致,可能是有人在你第一次读完之后将数据修改并提交了,导致你再读取的时候,数据和第一次读取的不一致,不知道该用哪一次。
什么是幻读?往往是针对的整表的操作,比如经理让你将整张user表都删掉,结果在你删的期间,有人往这张表中加了一条记录,当你删完之后,你觉着数据库中没有这张表了,但是一查,这张表中还有一条数据,这个时候你觉着自己产生了幻觉,怎么还有一条呢?明明都已经删了。这就叫幻读。
事务中为什么会产生这些并发问题呢?这是由你设置的事务的隔离级别决定的。我们说事务有四大特性,其中一个是隔离性,如果这个隔离性能够达到完全隔离,那么便不会出现这些并发问题。但是完全隔离是有代价的,会导致数据库性能的下降。考虑到完全隔离导致的性能下降问题,以及并不是所有的应用场景都需要完全隔离,所以我们设置了4种事务的隔离级别:分别是读未提交、读已提交、可重复读、串行化。实际开发中,会根据不同的业务场景选择不同的隔离级别,隔离级别不同,会产生不同的并发问题。
读未提交:会产生脏读、不可重复读、幻读等并发问题。
读已提交:会产生不可重复读、幻读等并发问题。
可重复读:会产生幻读问题。
串行化:完全隔离,不会产生任何并发问题。
mysql数据库默认的隔离级别是可重复读。
在理想情况下,事务之间是完全隔离的,从而可以防止这些问题发生,但是完全隔离会导致性能问题,因为它通常会涉及锁定数据库中的记录,侵占性的锁定会阻碍并发性,要求事务互相等待以完成各自的工作。
考虑到完全的隔离会导致性能问题,而且并不是所有的应用程序都需要完全的隔离,所以有时应用程序需要在事务隔离上有一定的灵活性。因此就会有各种隔离级别。
事务中有几种隔离级别呢?
答:4种。读未提交(uncommitted)、读已提交(committed)、可重复读(repeatable_read)、串行化(serializable)。
读未提交(uncommitted):允许读取尚未提交的数据变更。可能会导致脏读、不可重复读或幻读。
读已提交(committed):允许读取并发事务已经提交的数据。可以阻止脏读、但是不可重复读或幻读仍有可能发生。
可重复读(repeatable_read):可以阻止脏读和不可重复读,但可能会导致幻读。
串行化(serializable):完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读。这是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的。