1.何谓事物
一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。
2.事物的传播特性
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。默认的选择。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,挂起当前事务,新建事务结果不会影响当前存在事物的结果
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
3.事物的特性
原子性(Atomicity):指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败。
一致性(Consistency):指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
eg: 如果从A账户转账到B账户,必须保证A账户转出的钱到B账户。
隔离性(Isolation):指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。
持久性(Duration):指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
4.事物的隔离级别
未提交读(read uncommitted): 一个事务还没有提交时,它做的变更就能被别的事务看到。
已提交读(read committed): 一个事物提交之后,它做的变更才会被其他事务看到。
可重复读(repeatable read): 一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的。
串行化(serializable): 对于同一行记录,写会加“写锁”,读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行。
不同的隔离级别会产生不同的问题:
脏读: 一个事务读到另一个事务未提交的更新数据。
不可重复读: 一个事务两次读同一行数据,可是这两次读到的数据不一样。
幻读: 一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。