事务ACID
原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。
隔离性(isolcation):一个事务处理对另一个事务处理没有影响。
持续性(durability):事务处理的效果能够被永久保存下来 。
常用API
connection.setAutoCommit(false);
关闭自动提交, 打开事务。
connection.commit();
提交事务。
connection.rollback();
回滚事务。
Savepoint sp = conn.setSavepoint();
设置保存点
conn.rollback(sp);
回滚到保存点
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
设置隔离级别, 可以通过Connection中的常量设置
隔离级别
在多线程并发访问数据库并且使用事务的时候, 可能会遇到脏读, 不可重复读, 幻读的情况, 需要设置隔离级别来避免
脏读: 读到的线程未提交的数据
不可重复读: 在一个事务中读取同一个记录两次, 获取数据不同
幻读: 在一个事务中, 读取到的记录数不同
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交 Read Uncommitted |
√ |
√ |
√ |
读已提交 Read Committed |
|
√ |
√ |
可重复读 Repeatable Read |
|
|
√ |
可序列化 Serializable |
|
|
|
select@@tx_isolation;
查看隔离级别
set transactionisolation level read uncommitted;
设置读未提交
set transactionisolation level read committed;
设置读已提交
set transactionisolation level repeatable read;
设置可重复读
set transactionisolation level serializable;
设置可序列化
start transaction;
开始事务
rollback;
回滚事务
commit;
提交事务
获取插入的ID
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = ps.getGeneratedKeys();
if(rs.next())
user.setId(rs.getInt(1));
MySQL的select last_insert_id()可以获取之前插入的记录的id,但这只是MySQL才有的函数分页
通过ResultSet的滚动可以设置获取记录的位置,但这样是从数据库中查询出所有数据, 然后再从结果中筛选结果,性能非常低.
MySQL提供了分页语法. 在查询语句后可使用LIMIT关键字完成分页功能.
反射基础
构造函数
Class.getConstructors()
获取所有构造函数
Class.getConstructor(Class...);
获取到class中带有指定类型参数的构造函数
Constructor.newInstance(Object...);
使用构造函数创建对象, 传入指定参数
方法
Class.getMethods()
获取所有公有方法, 包括继承的
Class.getDeclaredMethods()
获取所有类中定义的方法, 包括私有的
Class.getMethod(String, Class...)
获取指定方法名和参数类型的方法(公有的)
Class.getDeclaredMethod(String, Class...)
获取指定方法名和参数类型的方法(类中定义的)
Method.invoke(Object, Object...)
在制定对象上运行方法, 将制定参数传入.
2011/9/14