一、事务的ACID属性
-
原子性atomicity 原子性是事务一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 -
一致性consistency 事务必须使数据库从一个一致性状态变换到另外一个一致性状态 -
隔离性 isolation 事务的隔离性指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 -
持久性 durability 持久性指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
二、四种隔离级别
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
select @@transaction_isolation
select @@global.transaction_isolation
set transaction isolation level read committed;
set transaction isolation level read committed;
三、Java设置数据库隔离级别
@Test
public void testTransactionSelect() throws Exception {
Connection conn=JDBCUtils.getConnection();
String sql="select user,password,balance from user_table where user=?";
ArrayList<User> users = getInstance(conn, User.class, sql, "CC");
for(User u:users)
{
System.out.println(u);
}
}
@Test
public void testTransactionUpdate() throws Exception {
Connection conn=JDBCUtils.getConnection();
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
String sql="update user_table set balance=? where user=?";
update(conn,sql,4000,"CC");
System.out.println("修改结束");
}
public <T> ArrayList<T> getInstance(Connection conn,Class<T> cl, String sql, Object...args) throws Exception
{
PreparedStatement ps = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql);
for(int i=0;i<args.length;i++)
{
ps.setObject(i+1,args[i]);
}
resultSet = ps.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount=metaData.getColumnCount();
ArrayList<T> list=new ArrayList<>();
while (resultSet.next())
{
T t = cl.newInstance();
for(int i=0;i<columnCount;i++) {
Object columnValue = resultSet.getObject(i + 1);
String columnLabel = metaData.getColumnLabel(i + 1);
Field field = cl.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null,ps,resultSet);
}
return null;
}
|