目录
如何在在数据库中创建用户名并赋予权限?
* create user 名 identified by "密码";
* 赋予权限:
* grant (select,insert,update,delete)赋予的操作 on test.* to 名@localhost identified by "密 码"
* 设置当前mySql链接的隔离级别:
* set transaction isolation level xxx;
* 设置数据库系统的全局的隔离急别:
* set global transaction isolation level xxx;
* 修改隔离级别后要重启mysql
1.什么叫数据库事务?
* 事务:一组逻辑操作单元,使数据从一种状态变换为另一种状态
* > 一组逻辑操作单元,一个或多个另一种状态。
*
* 2.数据一旦提交,就不可回滚。
*
* 3.哪些操作会导致数据的自动提交?
* >DDL操作一但执行都会自动提交
* >set autocommit = false失效。
* >DML默认情况也会。
* >我们可以通过 set autocommit = false的方式取消DML操作的自动提交
* >默认在关闭连接时,会自动的提交数据
* 标红的地方就是以下代码块中为什么在实现增删改查后不关闭链接的原因
* 4.回滚只能回滚到最近的一次commit之后
public class TransacrtionTest {
//通用查询2.0版本 考虑上事务
public <E> E query(Connection conn,Class<E> clazz, String sql, Object... args) throws Exception {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for(int i = 0 ; i <args.length;i++) {
ps.setObject(i+1,args[i]);
}
rs = ps.executeQuery();
ResultSetMetaData data = rs.getMetaData();
int columnCount = data.getColumnCount();
if(rs.next()) {
E e = clazz.newInstance();
for(int i = 0 ; i <columnCount;i++) {
Object columnValue = rs.getObject(i+1);
String columnLabel = data.getColumnLabel(i+1);
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(e, columnValue);
}
return e;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCconn.closeResource(null, ps, rs);
}
return null;
}
//通用增删改---version 2.0(考虑上事务)
public void updateInfo(Connection conn,String sql,Object...args) {
PreparedStatement p1=null;
try {
//1.预编译sql语句,返回PreparedStatement的实例
p1 = conn.prepareStatement(sql);
//2.填充占位符接下来具体的增删改操作循环,此时你有多少个参数就执行多少次,所以是args.length
for(int i =0 ;i<args.length;i++) {
//注意前面的参数是对应数据库中的哪个字段,而索引是从1开始的,所以是i+1,而后面的是java中的数组所以是i
p1.setObject(i+1,args[i]);
}
//3.执行
p1.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//4.关闭资源
}finally {
try {
if(p1!=null)
p1.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
// conn.close();
}
}
@Test
//演示脏读以下操作均在 transaction level = read uncommited和setAutoCommit(false)的条件下执行;
public void testTransactionSelect() throws Exception {
Connection conn = JDBCconn.getConn();
//设置事务的隔离级别
// conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
//取消数据库的自动提交
conn.setAutoCommit(false);
// boolean commit = conn.getAutoCommit();
String sql="select user,password,balance from user_table WHERE user = ?";
// System.out.println(commit);
User query = query(conn,User.class,sql,"CC");
System.out.println(query);
}
@Test
//先执行这个方法,当这个方法没有结束的时候,通过上面的方法查询会出现脏读问题,前提是数据是不会自动提交setAutoCommit(false)和隔离级别的 read uncommited
//当这个方法结束后由于没有提交数据,所以数据不会更新而不是回滚。在方法结束后 就算方法体里面没有commit和rollbake操作的时候,就算一个事务已经结束了
public void testTransactionUpdate() throws Exception {
Connection conn = JDBCconn.getConn();
String sql="update user_table set balance = ? where user = ?";
conn.setAutoCommit(false);
updateInfo(conn,sql,2000,"CC");
Thread.sleep(15000);
System.out.println("操作成功");
}
User类:
package Transaction;
public class User {
private String user;
private String password;
private int balance;
public User() {
super();
}
public User(String user, String password, int balance) {
super();
this.user = user;
this.password = password;
this.balance = balance;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public String toString() {
return "User [user=" + user + ", password=" + password + ", balance=" + balance + "]";
}
}