一、事务的ACID属性
-
原子性atomicity
原子性是事务一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 -
一致性consistency
事务必须使数据库从一个一致性状态变换到另外一个一致性状态 -
隔离性 isolation
事务的隔离性指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 -
持久性 durability
持久性指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
二、四种隔离级别
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
- 查看当前的隔离级别
select @@transaction_isolation
select @@global.transaction_isolation
- 设置当前mysql连接的隔离级别
set transaction isolation level read committed;
- 设置数据库系统全局的隔离级别
set transaction isolation level read committed;
三、Java设置数据库隔离级别
@Test
public void testTransactionSelect() throws Exception {
Connection conn=JDBCUtils.getConnection();
// System.out.println(conn.getTransactionIsolation());
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("修改结束");
}
//考虑事务的查询 version2.0
public <T> ArrayList<T> getInstance(Connection conn,Class<T> cl, String sql, Object...args) throws Exception
{
//Connection conn= null;
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())
{
//创建一个对象,属于cl类
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 {
// conn.close();
// ps.close();
// resultSet.close();
JDBCUtils.closeResource(null,ps,resultSet);
}
return null;
}