我们先说传播方式:
传播方式:
1.REQUIRED:
如果当前没有事务则创建事务,如果当前事务则加入事务.
2.NOT_SUPPORTED
容器不为这个方法开启事务
3.REQUIRES_NEW
开启一个新事物,如果原本方法存在事务则挂起等待该事务结束,在执行其他事务.
4.MANDATORY
必须在一个事务中进行,否则抛出异常.
5.NEVER
必须在无事务中进行,否则跑出异常.
6.SUPPORTS
有事务就用,没有就不用.
隔离级别
1.Read UnCommitted
读取未提交内容
这种隔离级别会让一个事务读取到另外一个事务没有提交的数据(脏读)
2.Read Committed
读取提交内容
这种隔离级别在同一个事务中会读取到另外一个事务已经提交的数据.(不可重复读),但是这种隔离级别会出现幻读,和上面说的不可重复读的情况
幻读: 在一个事务中多次重复查询之间,其他事务增加了结果集中的数据,则查询可能会查询到这个新数据.
(使用乐观锁和不可重复读可以解决多个线程更改同个数据的问题.)
PostgreSql的默认隔离级别是读已提交
3.Repeatable Read(可重读)
在同个事务的多个实例中同一个select语句查询的数据是相同的,也就是在同个事务中的多次查询的结果时相同的,但是这种隔离级别同样也会产生幻读.
(在InnoDB中通过多版本控制并发,解决了这种问题)
Mysql 的默认隔离级别就是repeatable
4.Serializable(可串行化)
通过强制事务排序来解决幻读问题,但是可能胡造成大量获取锁和等待的时间.
网友评论