Mysql中的事务:
从mysql4.1开始支持事务,事务是构成多用户使用数据库的基础,由作为一个单独单元的一个或多个sql语句组成。这个单元中的每个sql语句都是互相依赖的,并且单元作为一个整体是不可分割的。如果单元中的任何一个语句不能完成,那么整个单元都会被撤销,所有影响到的数据都将返回到事务开始以前的状态。
事务的ACID属性:
A原子性(atomicity):每个事务都必须被认为是一个不可分割的单元。如果一个事务由多个任务组成,其中的语句必须同时成功才能认为是成功的,否则系统将会返回到事务以前的状态,以保证数据的整体性没有受到影响。
C一致性(consistency):不管事务完全成功或中途失败,事务都要一致,保证了数据库从不返回一个未处理完的事务。
I隔离性(isolcation):每个事务在它自己的空间发生,和其它发生在系统中的事务隔离,而且事务的结果只有在它完全执行时才能看到。大多数的事务系统是使用页级锁定或行级锁定隔离不同事务之间的变化,但这是要以降低性能为代价的。隔离级别越高其性能就越低。
关于隔离级别的设定:
脏读: 读到的线程未提交的数据
不可重复读: 在一个事务中读取同一个记录两次, 获取数据不同
幻读: 在一个事务中, 读取到的记录数不同
隔离级别 | 脏读 | 不可重复读 | 幻读 |
未提交读 Read Uncommitted | √ | √ | √ |
已提交读 Read Committed |
| √ | √ |
可重复读 Repeatable Read |
|
| √ |
可序列化 Serializable |
|
|
|
隔离级别的设置方法:
select @@ tx_isolation;查看隔离级别
set transaction isolation level read uncommitted;设置为提交读
set transaction isolation level read committed;设置已提交读
set transaction isolation level repeatable read;设置可重复读
set transaction isolation level serializable;设置可序列化
注:系统默认的安全级别为可重复读;序列化隔离级别最高,但性能最低,提交读隔离级别最低,性能最高。
D持久性(durability):是指即使系统崩溃,一个提交的事务也仍然存在。Mysql是通过保存一条记录事务过程中系统变化的二进制事务日志文件来实现持久性。
事务的处理方式:
开始事务:START TRANSACTION
结束事务:COMMIT WORK
撤销事务:ROLLBACK WORK
撤销事务所作的修改,并结束当前事务
回滚事务:ROLLBACK WORK TO SAVEPOINT SI
事务回滚到SI保存点处,在该保存点之后的设置的保存点被删除,在该保存点后执行的所有操作被删除、
常用的处理事务方法:
connection setAutoCommit(false);关闭自动提交,打开事务
Connection commit();提交事务
Connection rollback();回滚事务
Savepoint sp = conn.setSavepoint();设置保存点
Conn.rollback(sp)l回滚到保存点
conn.setTransactionIsolation(Connection.TRANACTION_READ_COMMITTED);设置隔离级别,可通过connection中的常量设置
获取自增长的ID值:
Connection conn = null;
PrepareStatement ps = null;
ps = 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才有的函数
只对自增长型的ID发生自增长的赋值(即自动生成键)有效,并且是用getGeneratedKeys()返回的
批处理:
由于建立连接, 以及发送数据非常消耗性能, 如果有大批SQL命令需要处理, 最好使用批处理
Connection conn = null;
PrepareStatement ps = null;
ps = conn.prepareStatement(“insert into user (name,password,email,birthday) vales (?,?,?,?)”);
for(User user : list) {
ps.setString(1, user.getName());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
ps.setDate(4, new Date(user.getBirthday().getTime()));
ps.addBatch();
}
ps.executeBatch();
分页:
MySQL提供了分页语法. 在查询语句后可使用LIMIT关键字完成分页功能, 例如:
select * from user limit 40,20
查询从user表中取出从第41条开始的20条记录. 第一个参数表示忽略前面多少个, 第二个参数代表取多少个.
select * from user limit 3;
查询从user表冲取出前三条记录.一个参数表示取几个,起始位置就是数据库中的第一条记录