事务的第一大特性:原子性(Atomicity)它指一个事务中的所有操作要么都发生,要么都不发生,举个例子,对于银行转账,收款方和发款方必须同时加减同样的money,要么同时加减,要么都不加不减;
事务的第二大特性:一致性(Consistency)指在事务中,所有的数据必须保持完整,对于上述的银行转账,不管怎么转账,总钱数是不会变的;
事务的第三大特性:隔离性(Isolation)指多个用户并发访问数据库时,用户之间的事务不可以互相干扰,而且多个并发事务之间的数据要相互隔离.否则会产生一些问题,如脏读:一个事务读到了另一个事务未提交的数据,A和B说给他转账成功了,但是A没有提交,这时A可以回滚然后就出现问题了.
事务的第四大特性:持久性(Durability)指一个事务一旦被提交,它的所有对数据库数据的操作是永久性变化的,接下来不管数据库本身有什么操作都不会对它由任何影响.
隔离级别:解决问题
脏读:一个事务读到了另一个事务未提交的数据
不可重复读:一个事务读到了另一个事务已经提交的数据,引发另一个事务,在事务中的多次查询结果不一致
虚读/幻读:一个事务读到了另一个事务已经提交的数据.导致另一个事务在事务中多次的查询结果不一致.
1.read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据
存在:3个问题(脏读,不可重复读,虚读)
解决(0个问题)
2.read committed 读已提交,一个事务读到另一个事务已经提交的数据
存在:2个问题(不可重复读,虚读)
解决:1个问题(脏读)
3.repeatable read 可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交
存在:1个问题(虚读)
解决:2个问题(脏读,不可重复读)
4.serializable 串行化 ,同时只能执行一个事务,相当于事务中的单线程
存在:0个问题
解决:3个问题((脏读,不可重复读,虚读)
常见数据库的默认隔离级别:
MySql: repeatable read
Oracle:read committed