单条SQL语句是具有原子性的,即本身就是一个事务,读取时为共享锁,更新时为互斥锁。

复合语句的情况

虽然是复合语句但是在更新时也只有一条用于改变的语句,其它的也就是select了,所以对于update所操作的表为互斥锁,select所操作的表仍然是共享锁。

SQLServer 使用的分页查询语句如下(本人使用2014版)

use BookDB
Select * from (select * ,row_number() over(order by bookNo) as line from Book ) as t where t.line>=5 and t.line<=8

其中bookNo是列名,Book是表

显示的结果如下

mysql round后去掉小数点后的0 sql数据库祛除后面小数点_作用域

 

其中的注意 函数“row_number”必须有 OVER 子句。 其中row_number() over(order by bookNo)的意思是按照bookNo的顺序依次返回一个数字,从1开始。

然后将其重命名为line,这个line是自己启动新分组的名字。再将整体作为新表t,供外层select使用。

还可以这样 row_number() over (partition by column1 order by column2) 

表示先分组在排序,这时候的t.line表示的是组内的排序值,即在一个组内是依次排序,但不同的组互不影响,每个组都是从1开始排序

显示的结果如下

mysql round后去掉小数点后的0 sql数据库祛除后面小数点_作用域_02

 我的使用



@Override
    public List<Orders> findAllByStatus(String status, Integer currentPages, Integer rows) throws Exception {
        List<Orders> all = new ArrayList<Orders>();
        String sql = "Select * from (select *,row_number() over(order by o_id) as lines from orders where status = ?) as pages "
                + "where pages.lines>=? and pages.lines<=?";
        Integer start = (currentPages-1)*rows+1;      //分页起始值
        Integer end = currentPages*rows;            //结束 值
        this.pstmt = this.conn.prepareStatement(sql);
        this.pstmt.setString(1, status);
        this.pstmt.setInt(2, start);
        this.pstmt.setInt(3, end);
        ResultSet rs = this.pstmt.executeQuery();
        while(rs.next()) {
            Orders order = new Orders();
            order.setO_id(rs.getInt(1));
            order.setC_id(rs.getString(2));
            order.setTime(rs.getTimestamp(3));
            order.setTotal(rs.getDouble(4));
            order.setStatus(rs.getString(5));
            order.setS_name(rs.getString(6));
            order.setS_phone(rs.getString(7));
            all.add(order);
        }
        return all;
    }



还有一个是返回自增函数的自增值



@Override
    public Integer create(Orders pojo) throws Exception {
        String sql = "insert into orders values (?, ?, ?, ?, ?, ?) select  SCOPE_IDENTITY()";   //select SCOPE_IDENTITY()是关键
        this.pstmt = this.conn.prepareStatement(sql);     //这条语句直到获取到自增值前,应该具有原子性
        this.pstmt.setString(1, pojo.getC_id());
        this.pstmt.setTimestamp(2, pojo.getTime());
        this.pstmt.setDouble(3, pojo.getTotal());
        this.pstmt.setString(4, pojo.getStatus());
        this.pstmt.setString(5, pojo.getS_name());
        this.pstmt.setString(6, pojo.getS_phone());
        this.pstmt.executeUpdate();
        ResultSet rs = this.pstmt.getGeneratedKeys();    //这里是获取自增值的地方
        if(rs.next()) {
            return rs.getInt(1);
        }else {
            return -1;
        }
    }



 

这个SCOPE_IDENTITY()的意思是:

返回为当前会话和当前作用域中的某个表生成的最新标识值。即返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。即在连接建立直到连接关闭或连接重置前,都可以使用。

IDENTITY列即为标识列,是SQL Server中的标识列又称标识符列,习惯上又叫自增列。并且每个表中只能由一个自增列。

综合就是 获取这个链接中最后生成的那个自增值。即最后一行的自增值。

类似的还有IDENT_CURRENT( 'table_name' ) 返回为任何会话和任何作用域中的任何表最后生成的标识值。 @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。