1.事务是什么
事务是并发控制的单位,是用户定义的一个操作序列,这些操要么都做,要么都不做,是一个不可分割的工作单位.
2.事务的特性
①原子性:表示事务内不可分割,要么都成功,要么都失败
②一致性: 表示事务做完后,要求满足数据库的一些完整性约束.也就是事务要么都成功,要么都失败,失败了,要对前面的操作进行回滚.
③隔离性:表示一个事务开启了,不能受其它事务的影响
④持久性:表示事务开始了,就不能中止,在事务提交后,要将数据序列化到数据库
3.事务的隔离级别
①read uncommitted:读未提交,就是一个事务可以读取另一个未提交事务的数据.
②read committed:读已提交,就是一个事务所做的修改在未提交之前,其它事务是无法读到所修改的数据的,oracle默认的隔离级别是read committed
③repeatable read:可重复读,同一个事务多次查询的结构结果是一致的,mysql默认的隔离级别就是repeatable read
④serialzable:可串行化,就是多个线程(事务)完全不并发,串行执行,当然不会有任何隔离问题,显而易见效率也最低,一般不采用.
4.事务不考虑隔离级别产生三个读问题及解决方案
隔离级别
|
脏读
|
不可重复读
|
虚读
|
---|---|---|---|
读未提交
|
是
|
是
|
是
|
读已提交
|
否
|
是
|
是
|
可重复读
|
否
|
否
|
是
|
可串行化
|
否
|
否
|
否
|
传播行为 | 意义 |
---|---|
PROPAGATION_MANDATORY | 表示该方法必须运行在一个事务中。如果当前没有事务正在发生,将抛出一个异常 |
PROPAGATION_NESTED | 表示如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样。 |
PROPAGATION_NEVER | 表示当前的方法不应该在一个事务中运行。如果一个事务正在进行,则会抛出一个异常。 |
PROPAGATION_NOT_SUPPORTED | 表示该方法不应该在一个事务中运行。如果一个现有事务正在进行中,它将在该方法的运行期间被挂起。 |
PROPAGATION_SUPPORTS | 表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行。 |
PROPAGATION_REQUIRES_NEW | 表示当前方法必须在它自己的事务里运行。一个新的事务将被启动,而且如果有一个现有事务在运行的话,则将在这个方法运行期间被挂起。 |
PROPAGATION_REQUIRES | 表示当前方法必须在一个事务中运行。如果一个现有事务正在进行中,该方法将在那个事务中运行,否则就要开始一个新事务。 |
6.SOA中如何保证事务一致性
①两阶段提交
②事务的补偿机制: 补偿事务是一种在业务端实施业务逆向操作事务,来保证业务数据一致性的方式
③阿里的GTS