事务传播特性了解事务的几种传播特性
数据库操作1
数据库操作2
PROPAGATION_REQUIRED
Transaction1
Transaction1
null
Transaction2
PROPAGATION_SUPPORTS
Transaction1
Transaction1
null
null
PROPAGATION_MANDATORY
Transaction1
Transaction1
null
Throws Exception
PROPAGATION_REQUIRES_NEW
Transaction1
Transaction2
null
Transaction2
PROPAGATION_NOT_SUPPORTED
Transaction1
null
null
null
PROPAGATION_NEVER
Transaction1
Throws Exception
null
null
PROPAGATION_NESTED(Spring)
Transaction1
Transaction2
[Transaction1]
null
Transaction2
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,
则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
事务隔离级别
脏读
不可重复读
幻象读
ISOLATION_READ_UNCOMMITTED
√
√
√
ISOLATION_READ_COMMITTED
√
√
ISOLATION_REPEATABLE_READ
√
ISOLATION_SERIALIZABLE
ISOLATION_DEFAULT
PlatfromTransactionManager
默认的隔离级别
SQLServer :READ_COMMITTED
MySql:REPEATABLE_READ
Spring事务的隔离级别
1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
除了防止脏读,不可重复读外,还避免了幻像读。
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读是 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。
幻觉读是 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
DisplayMetrics display = new DisplayMetrics();
//该方法主要是用于 实例化DisplayMetrics 对象,不能省略。
getWindowManager().getDefaultDisplay().getMetrics(display);
String fenbian = display.widthPixels + " x " + display.heightPixels;
mTextView2 = (TextView) findViewById(R.id.mTextView02);
mTextView2.setText(fenbian);
java基础中的容器:
Collection接口
hashCode
实例(马士兵视频源码):
import java.util.*; public class basicCollectionTest2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Collection c=new HashSet(); c.add("11"); c.add(new Name("f1","wang")); c.add("zhu"); System.out.println(c); //remove 删除 c.remove("11"); c.remove(new Name("f1","wang")); c.remove("zhu"); System.out.println(c); } } class Name { String firstname,lastname; //构造函数 public Name(String firstname,String lastname){ this.firstname=firstname; this.lastname=lastname; } //返回 public String getFirstname(){ return firstname; } public String getLasttname(){ return lastname; } public String toString(){ return lastname+" "+firstname; } /* * 重写equals方法后要同时重写hashCode方法 * 当对象变为索引时,需要hashCode方法 * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj){ if(obj instanceof Name){ Name name=(Name)obj; return (firstname.equals(name.firstname)&& lastname.equals(name.lastname)); } return super.equals(obj); } public int hashCode(){ return firstname.hashCode(); } }