
sql语句对数据库操作构成事物。
事物的特性:ACID
•Atomicity(原子性):一个事物要么全都被执行,要么全都不执行,不会存在执行结束在中间环节。如果事物在执行过程中发生异常,则会回滚到事物执行之前的状态。可以简单认为"同生共死"。
•Consistency(一致性):在事物开始之前和事物结束之后,数据库的完整性没有被破坏,操作符合预期。
•Isolation(隔离性):同一时间,只允许一个事物请求同一数据。同一时间多个用户并发访问数据库时,数据库为每一个用户开启一个事物,不同事物之间彼此互相隔离。
•Durability(持久性):一个事物一旦被提交,那么对数据库中数据的影响是永久的,即使数据库遇到故障也不会改变事物对数据库的操作。
对于事物,如果不考虑隔离级别,则会出现问题:
1.脏读
对于事物A和B,事物A读取了B未提交的数据,事物B遇到异常进行了回滚操作,那么就会产生脏读。
2.不可重复读
事物A多次对同一数据进行读取,在读取过程中事物B对数据进行多次修改,导致事物A每次读取的数据都不一致(侧重于修改)。
3.幻读
事物A对数据进行了修改,事物B进行了插入或删除操作,事物A操作结束以后发现仍旧存在未被修改的数据,仿佛幻觉一样,称之为幻读(侧重于新增或删除)。
数据库提供四种隔离级别:
事物隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 会 | 会 | 会 |
读已提交 | 否 | 会 | 会 |
可重复读 | 否 | 否 | 会 |
序列化 | 否 | 否 | 否 |
1.读未提交(Read Uncommitted)
可以读取到未被提交的数据
2.读已提交(Read Committed)
可以读取已经提交的数据
3.可重复读(Repeatable Read)
在数据读取之后加锁,明确数据读取是为了更新,不允许其他事物进行修改,类似读取数据之后事物不结束,其他事物无法操作。
4.序列化(Serializable)
对于一个事物,必须执行完该事物的所有子事物才可以执行其他的事物 。
隔离级别:序列化>可重复读>读已提交>读未提交