private void handleCreateTableTransactionalProp(PreCreateTableEvent context) throws MetaException {
    Table newTable = context.getTable();
    Map<String, String> parameters = newTable.getParameters();
    if (parameters == null || parameters.isEmpty()) {
      makeAcid(newTable);
      return;
    }
    String transactional = null;
    String transactionalProperties = null;
    Set<String> keys = new HashSet<>(parameters.keySet());
    for(String key : keys) {
      // Get the "transactional" tblproperties value
      if (hive_metastoreConstants.TABLE_IS_TRANSACTIONAL.equalsIgnoreCase(key)) {
        transactional = parameters.get(key);
        parameters.remove(key);
      }

      // Get the "transactional_properties" tblproperties value
      if (hive_metastoreConstants.TABLE_TRANSACTIONAL_PROPERTIES.equalsIgnoreCase(key)) {
        transactionalProperties = parameters.get(key);
      }
    }

    if (transactional == null) {
      makeAcid(newTable);
      return;
    }

    if ("false".equalsIgnoreCase(transactional)) {
      // just drop transactional=false - absence of 'transactional' property is equivalent to
      // transactional=false
      return;
    }

    if ("true".equalsIgnoreCase(transactional)) {
      if (!conformToAcid(newTable)) {
        // INSERT_ONLY tables don't have to conform to ACID requirement like ORC or bucketing
        if (transactionalProperties == null || !"insert_only".equalsIgnoreCase(transactionalProperties)) {
          throw new MetaException("The table must be stored using an ACID compliant format (such as ORC): "
              + Warehouse.getQualifiedName(newTable));
        }
      }

      if (MetaStoreUtils.isExternalTable(newTable)) {
        throw new MetaException(Warehouse.getQualifiedName(newTable) +
            " cannot be declared transactional because it's an external table");
      }

      // normalize prop name
      parameters.put(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL, Boolean.TRUE.toString());
      if(transactionalProperties == null) {
        normalizeTransactionalPropertyDefault(newTable);
      }
      initializeTransactionalProperties(newTable);
      checkSorted(newTable);
      return;
    }
    // transactional is found, but the value is not in expected range
    throw new MetaException("'transactional' property of TBLPROPERTIES may only have value 'true': "
        + Warehouse.getQualifiedName(newTable));
  }
Normalize case and make sure:
1. 'true' is the only value to be set for 'transactional' (if set at all)
2. If set to 'true', we should also enforce bucketing and ORC format
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java